Подробный гайд по проверке кодировки .docx

Подробный гайд по проверке кодировки .docx: внутренний XML, OpenEncoding, SaveEncoding и TextEncoding, работа с ZIP, VBA и инструментами.

2026.10.06                  


Подробный гайд по проверке кодировки .docxПодробный гайд по проверке кодировки .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» может означать три разных действия:

  1. Проверить внутреннюю кодировку XML (какая кодировка реально в байтах внутри контейнера).
  2. Проверить, с какой кодировкой Word открыл документ (свойство OpenEncoding).
  3. Проверить настройки кодировки, которые будут применены при сохранении (SaveEncoding/TextEncoding).

2. Проверка внутренней кодировки XML (самый надёжный способ)

Поскольку .docx — это ZIP, можно напрямую inspect-ить XML-части.

Способ 2.1. Через распаковку архива

  1. Скопируйте .docx и переименуйте копию в .zip.
  2. Распакуйте любым архиватором (7-Zip, WinRAR, встроенный в проводник Windows).
  3. Откройте файл 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)

  1. Откройте документ в Word.
  2. Нажмите Alt + F11 (редактор VBA).
  3. Вставьте код в 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.

Порядок действий:

  1. Проверьте расширение и сигнатуру файла. Откройте файл в hex-редакторе. Настоящий .docx начинается с PK (ZIP). Если там D0 CF 11 E0 — это старый .doc (OLE2). Если просто текст — это не .docx.
  2. Включите подтверждение преобразования формата в Word.
    • Файл → Параметры → Дополнительно.
    • В разделе «Общие» поставьте галочку «Подтверждать преобразование формата файла при открытии».
    • Теперь при открытии проблемного файла Word покажет диалог «Преобразование файла». Выберите «Кодированный текст» и вручную подберите кодировку (обычно Кириллица (Windows-1251) или Юникод (UTF-8)).
  3. Если файл действительно .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 для подбора кодировки.


Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта