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

Подробный гайд по проверке кодировки .xlsx: анализ XML внутри архива, Python, CSV-импорт, Excel и Notepad++. Узнайте, как найти и исправить кракозябры.

2026.10.07                  


Подробный гайд по проверке кодировки .xlsxПодробный гайд по проверке кодировки .xlsx Файл .xlsx — это не простой текстовый файл, а ZIP-архив, содержащий набор XML-документов и других ресурсов. Поэтому «проверка кодировки» для него может означать две принципиально разные задачи: проверку внутренней кодировки самого файла Excel (которая почти всегда UTF-8) или проверку кодировки, которая использовалась при импорте/экспорте данных (например, из CSV).


Что такое .xlsx с точки зрения кодировки

Формат .xlsx основан на стандарте Office Open XML (OOXML). Сам файл — это ZIP-контейнер, внутри которого находятся XML-файлы (например, xl/workbook.xml, xl/sharedStrings.xml), и именно в них хранятся текстовые данные.



Согласно спецификации OOXML, все XML-части в .docx, .pptx и .xlsx должны использовать декларацию:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Это означает, что внутренняя кодировка любого корректного .xlsx файла — UTF-8. Microsoft подтверждает: если переименовать .xlsx в .zip и распаковать, в начале XML-файлов вы увидите указание encoding="UTF-8".


Важно:

Это не значит, что в файле не может быть «испорченных» данных. Если при создании файла исходные тексты были в другой кодировке (например, Windows-1251) и их неправильно преобразовали в UTF-8, внутри XML появятся неверные байты, которые будут отображаться как «кракозябры».


Способ 1: Прямая проверка XML-декларации внутри .xlsx

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

Шаги:

  1. Скопируйте файл .xlsx и переименуйте копию в .zip (например, data.xlsx → data.zip).
  2. Распакуйте архив любым архиватором (7-Zip, WinRAR, встроенный в Windows).
  3. Перейдите в папку xl/. Найдите файлы:
    • sharedStrings.xml — здесь хранятся все текстовые строки таблицы.
    • workbook.xml — метаданные книги.
    • worksheets/sheet1.xml — данные листов.
  4. Откройте любой из этих XML-файлов в текстовом редакторе (Блокнот, Notepad++, VS Code).
  5. Посмотрите на первую строку. В корректном файле вы увидите:
   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Если там указана другая кодировка (например, windows-1251 или UTF-16), это может быть причиной проблем при чтении некоторыми парсерами.


Этот метод даёт точный ответ о заявленной кодировке, но не гарантирует, что все тексты внутри действительно корректно закодированы в UTF-8.


Способ 2: Проверка кодировки через Python

Если вы работаете с файлами программно, можно использовать Python для анализа.

2.1. Проверка XML-декларации через zipfile и re

import zipfile
import re

def check_xlsx_internal_encoding(file_path):
    with zipfile.ZipFile(file_path, 'r') as z:
        # Проверяем sharedStrings.xml (основной файл с текстом)
        if 'xl/sharedStrings.xml' in z.namelist():
            with z.open('xl/sharedStrings.xml') as f:
                first_line = f.readline().decode('utf-8', errors='ignore')
                match = re.search(r'encoding="([^"]+)"', first_line)
                if match:
                    print(f"Заявленная кодировка: {match.group(1)}")
                else:
                    print("Декларация кодировки не найдена")
        else:
            print("Файл sharedStrings.xml отсутствует")

check_xlsx_internal_encoding('data.xlsx')

Этот код покажет, какая кодировка указана в XML-декларации.


2.2. Обнаружение кодировки текста с помощью chardet

Если вы подозреваете, что тексты внутри файла были записаны в неверной кодировке, можно попробовать определить её эвристически. Однако имейте в виду: chardet плохо работает с ZIP-контейнерами, поэтому сначала нужно извлечь текст.

import zipfile
import chardet

def detect_text_encoding_in_xlsx(file_path):
    with zipfile.ZipFile(file_path, 'r') as z:
        with z.open('xl/sharedStrings.xml') as f:
            raw = f.read()
            # Ищем байты внутри тегов <t>...</t>
            # (упрощённый пример, реальный XML требует парсинга)
            result = chardet.detect(raw)
            print(f"Предполагаемая кодировка: {result['encoding']} (уверенность: {result['confidence']:.2f})")

detect_text_encoding_in_xlsx('data.xlsx')



Для более точного анализа используйте BeautifulSoup с UnicodeDammit, который показывает лучшие результаты для текстов на европейских языках. Но помните: если файл был сохранён Excel корректно, он всегда будет UTF-8, и chardet может ошибиться, особенно на коротких строках.


2.3. Чтение через pandas и openpyxl

Если ваша цель — просто прочитать данные и убедиться, что текст отображается правильно, используйте:

import pandas as pd

# pandas автоматически обрабатывает .xlsx через openpyxl
df = pd.read_excel('data.xlsx')
print(df.head())

openpyxl и pandas корректно работают с UTF-8 внутри .xlsx, поэтому если текст отображается правильно — проблема не во внутренней кодировке файла.


Способ 3: Проверка кодировки при импорте CSV (самый частый случай)

Большинство проблем с «кодировкой .xlsx» на самом деле возникают, когда файл на самом деле является CSV, но был переименован в .xlsx или открыт Excel с неверными настройками.

Как понять, что это CSV, а не настоящий XLSX:

  1. Откройте файл в Блокноте (Notepad).
  2. Если вы видите читаемый текст, разделённый запятыми или точками с запятой — это CSV.
  3. Если вы видите PK в начале и нечитаемые символы — это настоящий ZIP-архив, то есть .xlsx.

Если это CSV, вот как проверить и указать кодировку:

В Excel (Windows):

  1. Откройте пустую книгу.
  2. Перейдите на вкладку «Данные» → «Из текста/CSV».
  3. Выберите файл.
  4. В окне предпросмотра нажмите на выпадающий список «Файл Origin» (или «Кодировка файла») и выберите нужную кодировку: UTF-8, Кириллица (Windows-1251), Кириллица (ISO-8859-5) и т.д.
  5. Смотрите на предпросмотр, пока текст не станет читаемым.

В LibreOffice Calc:

При открытии CSV появится диалог, где можно выбрать «Набор символов» (Character set). Попробуйте UTF-8, Cyrillic (Windows-1251), Cyrillic (ISO-8859-5).


Через Python при чтении CSV:

import pandas as pd

# Попробуйте разные кодировки
for enc in ['utf-8', 'windows-1251', 'cp1251', 'koi8-r']:
    try:
        df = pd.read_csv('data.csv', encoding=enc)
        print(f"Успешно прочитано с кодировкой: {enc}")
        print(df.head())
        break
    except UnicodeDecodeError:
        print(f"Не удалось с {enc}")

Способ 4: Проверка в текстовых редакторах

Notepad++ (Windows):

  1. Откройте файл (если это CSV или XML).
  2. Меню «Кодировки» (Encoding) → выберите «Набор символов» (Character Set).
  3. Перебирайте варианты: UTF-8, Windows-1251, GB2312, Big5 и т.д., пока текст не станет читаемым.
  4. Если ни один вариант не помогает — данные были испорчены на этапе экспорта, и восстановить их без исходника невозможно.

Visual Studio Code:

В правом нижнем углу окна отображается текущая кодировка. Нажмите на неё и выберите «Reopen with Encoding», затем перебирайте варианты.


Сводная таблица: что и как проверять

Ситуация Что проверять Инструмент
Файл открывается с «кракозябрами» Является ли файл настоящим XLSX или это CSV? Блокнот (поиск PK в начале)
Нужно узнать внутреннюю кодировку XLSX XML-декларация в xl/sharedStrings.xml 7-Zip + Блокнот, Python zipfile
Нужно прочитать CSV с правильной кодировкой Выбор кодировки при импорте Excel «Из текста/CSV», LibreOffice, Python pandas
Автоматическое определение кодировки Эвристика Python chardet, bs4.UnicodeDammit
Текст в XLSX отображается неверно Возможно, данные были испорчены при создании Проверка XML-декларации; если UTF-8, но текст битый — исходник утерян

Важно

Если вы убедились, что внутри .xlsx стоит encoding="UTF-8", но текст всё равно отображается неправильно, это не проблема кодировки файла. Скорее всего, данные были записаны в файл уже в испорченном виде (например, исходный текст в Windows-1251 был принудительно преобразован в UTF-8 без перекодировки). В таком случае восстановить исходные символы невозможно без оригинального источника данных.



Если же вы работаете с CSV и видите «кракозябры», почти всегда достаточно правильно указать кодировку при импорте — это самая распространённая и легко решаемая проблема.


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


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

Комментарии

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