Подробный гайд по проверке кодировки .docx
Проверка параметров кодирования .docx — задача, которая может понадобиться в разных ситуациях: при появлении «кракозябр», для отладки программ, генерирующих .docx, или при forensic-анализе файлов. Важно понимать, что сам формат .docx не имеет единой «кодировки файла» — это ZIP-архив, внутри которого лежат XML-файлы, и каждый из них может иметь свою кодировку. Кроме того, Word хранит отдельные настройки кодировки для открытия, сохранения и текстового экспорта.
1. Теоретическая база: какие кодировки бывают в .docx
Формат Office Open XML (OOXML), к которому относится .docx, устроен так:
- Файл .docx — это ZIP-контейнер. Его можно переименовать в .zip и распаковать.
- Внутри находятся XML-части:
word/document.xml(основной текст),word/styles.xml,docProps/core.xml(метаданные) и др. - Стандартная кодировка для всех XML-частей в .docx — UTF-8 (или в редких случаях UTF-16). В прологе XML явно указывается:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>.
Word (приложение) также имеет свойства кодировки для операций с текстовыми файлами:
OpenEncoding— кодировка, с которой документ был открыт (только чтение).SaveEncoding— кодировка, которая будет использована при сохранении (чтение/запись).TextEncoding— кодовая страница для сохранения документа как текстового файла (не .docx, а .txt/.csv).
Таким образом, «проверка кодировки .docx» может означать три разных действия:
- Проверить внутреннюю кодировку XML (какая кодировка реально в байтах внутри контейнера).
- Проверить, с какой кодировкой Word открыл документ (свойство
OpenEncoding). - Проверить настройки кодировки, которые будут применены при сохранении (
SaveEncoding/TextEncoding).
2. Проверка внутренней кодировки XML (самый надёжный способ)
Поскольку .docx — это ZIP, можно напрямую inspect-ить XML-части.
Способ 2.1. Через распаковку архива
- Скопируйте .docx и переименуйте копию в
.zip. - Распакуйте любым архиватором (7-Zip, WinRAR, встроенный в проводник Windows).
- Откройте файл
word/document.xmlв текстовом редакторе, который показывает кодировку (Notepad++, VS Code, Sublime Text).
4. Первая строка (XML-пролог) укажет заявленную кодировку:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Если там UTF-8 — это стандарт. Если UTF-16 — документ был создан нестандартно, но Word его откроет.
5. Важная проверка:
Заявленная кодировка в прологе может не совпадать с фактической кодировкой байтов.
Чтобы убедиться, откройте файл в hex-редакторе (например, HxD) и посмотрите на первые байты:
EF BB BF— UTF-8 с BOM (некоторые парсеры могут ругаться, но Word обычно принимает).FF FEилиFE FF— UTF-16.- Отсутствие BOM и валидные последовательности для кириллицы (например,
D0 9Fдля «П») — чистый UTF-8 без BOM.
6. Если XML-пролог заявляет UTF-8, а байты не декодируются как UTF-8, документ повреждён или был сохранён некорректно (например, UTF-16 без изменения пролога).
Способ 2.2. Через командную строку (Linux/macOS/WSL)
unzip -p document.docx word/document.xml | head -c 100
Покажет начало XML. Для проверки валидности UTF-8:
unzip -p document.docx word/document.xml | iconv -f UTF-8 -t UTF-8 > /dev/null && echo "Valid UTF-8" || echo "Invalid UTF-8"
Способ 2.3. Через Python (для автоматизации)
import zipfile
with zipfile.ZipFile('document.docx', 'r') as z:
xml_bytes = z.read('word/document.xml')
# Извлекаем заявленную кодировку из пролога
import re
m = re.search(rb'encoding="([^"]+)"', xml_bytes[:200])
declared = m.group(1).decode() if m else 'не указана'
print(f"Заявленная кодировка: {declared}")
# Пытаемся декодировать как UTF-8
try:
xml_bytes.decode('utf-8')
print("Фактически валидный UTF-8")
except UnicodeDecodeError:
print("Не является валидным UTF-8 — возможно, UTF-16 или повреждение")
Этот метод показывает и заявленную, и фактическую кодировку.
3. Проверка кодировки, с которой Word открыл документ (OpenEncoding)
Свойство OpenEncoding доступно только через объектную модель Word (VBA или .NET). Оно возвращает константу MsoEncoding, которая показывает, как Word интерпретировал байты при открытии.
Важно:
Для .docx (в отличие от .txt/.doc) это свойство почти всегда будет возвращать msoEncodingUTF8 или msoEncodingUnicode, потому что XML-части внутри контейнера по стандарту UTF-8/UTF-16. Однако оно может быть полезно, если документ был открыт как «Восстановленный текст» или после конвертации.
Через VBA (Word)
- Откройте документ в Word.
- Нажмите
Alt + F11(редактор VBA). - Вставьте код в Immediate Window (
Ctrl + G) или в новый модуль:
MsgBox "Кодировка открытия: " & ActiveDocument.OpenEncoding
If ActiveDocument.OpenEncoding = msoEncodingUTF7 Then
MsgBox "Документ был открыт как UTF-7"
End If
Пример из документации Microsoft проверяет именно UTF-7.
4. Нажмите F5. Появится числовое значение константы. Расшифровку можно найти в документации MsoEncoding.
Через .NET (C#)
using Word = Microsoft.Office.Interop.Word;
var app = new Word.Application();
var doc = app.Documents.Open(@"C:\path\file.docx");
Word.MsoEncoding enc = doc.OpenEncoding;
Console.WriteLine($"OpenEncoding: {enc}");
doc.Close();
app.Quit();
Этот способ используется в надстройках и внешних утилитах.
4. Проверка настроек кодировки при сохранении (SaveEncoding и TextEncoding)
Эти свойства не влияют на содержимое .docx (внутри всё равно UTF-8), но важны, если вы сохраняете документ как текстовый файл или в другом формате.
SaveEncoding — кодировка при сохранении
SaveEncoding определяет, в какой кодировке будет сохранён документ, если его сохранить как encoded text file (например, .txt). Для .docx это свойство не меняет XML-части, но может влиять на экспорт.
VBA:
' Установить западную кодировку для сохранения
ActiveDocument.SaveEncoding = msoEncodingWestern
' Или прочитать текущую
MsgBox ActiveDocument.SaveEncoding
Документация Microsoft показывает пример msoEncodingWestern.
TextEncoding — кодовая страница для текстового экспорта
TextEncoding задаёт кодовую страницу или набор символов, который Word использует для документа, сохранённого как зашифрованный текстовый файл (encoded text file). Это отдельная настройка от HTML-кодировки.
VBA:
ActiveDocument.TextEncoding = msoEncodingCyrillic ' Windows-1251
MsgBox ActiveDocument.TextEncoding
Свойство позволяет задать кодировку для отдельного документа; для всех документов сразу используется DefaultTextEncoding.
5. Практический сценарий: документ открывается «кракозябрами»
Если .docx отображается некорректно (иероглифы, квадраты), чаще всего проблема не во внутренней кодировке .docx (она почти всегда UTF-8), а в неправильном определении кодировки при открытии или в том, что файл на самом деле не .docx, а переименованный .txt/.doc.
Порядок действий:
- Проверьте расширение и сигнатуру файла. Откройте файл в hex-редакторе. Настоящий .docx начинается с
PK(ZIP). Если тамD0 CF 11 E0— это старый .doc (OLE2). Если просто текст — это не .docx. - Включите подтверждение преобразования формата в Word.
Файл→Параметры→Дополнительно.- В разделе «Общие» поставьте галочку «Подтверждать преобразование формата файла при открытии».
- Теперь при открытии проблемного файла Word покажет диалог «Преобразование файла». Выберите «Кодированный текст» и вручную подберите кодировку (обычно Кириллица (Windows-1251) или Юникод (UTF-8)).
- Если файл действительно .docx, но текст повреждён внутри XML — распакуйте архив и проверьте
word/document.xml. Если XML не декодируется как UTF-8, возможно, файл был сохранён некорректно (например, с UTF-16 без BOM или с изменённым прологом). В таком случае можно попытаться перекодировать XML и собрать .docx заново, но это требует осторожности.
6. Сторонние инструменты для проверки кодировки
- Notepad++: откройте XML-файл из архива — в меню «Кодировки» будет показана текущая кодировка, можно переключить.
- VS Code: в правом нижнем углу отображается кодировка файла; можно нажать и выбрать «Reopen with Encoding».
- HxD (hex-редактор): покажет BOM и байты.
- GroupDocs.Parser (.NET): позволяет программно определить кодировку документа, включая .docx.
- xmllint (Linux):
xmllint --encode utf-8 word/document.xml— перекодирует в UTF-8, попутно сообщая о проблемах.
7. Краткая сводка: что и как проверять
| Что проверяем | Инструмент | Как |
|---|---|---|
| Внутренняя кодировка XML | Распаковка ZIP + текстовый/hex-редактор | Первая строка word/document.xml; проверка BOM |
| Фактическая валидность UTF-8 | Python / iconv | Декодировать байты XML как UTF-8 |
| Кодировка открытия в Word | VBA (OpenEncoding) |
MsgBox ActiveDocument.OpenEncoding |
| Кодировка сохранения | VBA (SaveEncoding) |
ActiveDocument.SaveEncoding = ... |
| Кодировка для текстового экспорта | VBA (TextEncoding) |
ActiveDocument.TextEncoding = ... |
| Проблемы с отображением | Word UI | Включить «Подтверждать преобразование формата» и выбрать кодировку вручную |
Главный вывод:
для .docx внутренняя кодировка практически всегда UTF-8, и «проверка параметров кодирования» сводится либо к инспекции XML внутри ZIP-контейнера, либо к чтению свойств Word через VBA/.NET. Если документ открывается некорректно, сначала убедитесь, что это действительно .docx, а затем используйте диалог преобразования формата в Word для подбора кодировки.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.