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

Как проверить кодировку .txt: BOM, UTF-8, Windows-1251, KOI8-R. Утилиты file, uchardet, Python, Notepad++ и конвертация в UTF-8.

2026.10.06                  


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

Главное:

В обычном .txt нет метаданных о кодировке. Точно определить её можно только если есть BOM (метка порядка байтов). Во всех остальных случаях это эвристика: утилиты и редакторы угадывают, а вы проверяете глазами.


1. Быстрый алгоритм

  1. Проверьте первые байты файла — есть ли BOM.
  2. Если BOM есть — кодировка известна.
  3. Если BOM нет — проверьте, валиден ли UTF-8.
  4. Если UTF-8 невалиден — проверьте типичные кодировки: Windows-1251, KOI8-R, ISO-8859-5.
  5. Откройте файл в редакторе и переключите кодировку вручную.
  6. Убедитесь, что русский текст читается: Привет, а не Привет или �����.
  7. При необходимости конвертируйте в UTF-8.



2. Проверка BOM

BOM — несколько байт в начале файла.

BOM Кодировка
EF BB BF UTF-8 with BOM
FF FE UTF-16 LE
FE FF UTF-16 BE
FF FE 00 00 UTF-32 LE
00 00 FE FF UTF-32 BE

Linux / macOS

xxd -l 4 file.txt
# или
hexdump -C file.txt | head -n 1
# или
od -An -tx1 -N4 file.txt

Пример:

00000000  ef bb bf d0 9f ...  |...П...|

Значит, UTF-8 с BOM.


Windows PowerShell

Format-Hex .\file.txt | Select-Object -First 1

Или:

$b = [IO.File]::ReadAllBytes("file.txt")[0..3]
'{0:X2} {1:X2} {2:X2} {3:X2}' -f $b[0],$b[1],$b[2],$b[3]

Если BOM нет, первые байты могут быть чем угодно: D0 9F — начало UTF-8 для П, CF F0 — часто Привет в CP1251 и т.д.


3. Автоопределение утилитами

Linux / macOS

file --mime-encoding file.txt
file -i file.txt          # в Linux
file -I file.txt          # в macOS

Пример вывода:

text/plain; charset=utf-8
text/plain; charset=iso-8859-1
text/plain; charset=unknown-8bit

Установите и используйте:

uchardet file.txt
enca -L ru file.txt
  • uchardet хорошо определяет UTF-8, CP1251, KOI8-R.
  • enca -L ru удобен для русских текстов.

Python

Установите:

pip install chardet charset-normalizer

chardet:

chardetect file.txt

или:

import chardet
data = open("file.txt", "rb").read()
print(chardet.detect(data))

charset-normalizer:

from charset_normalizer import from_path
result = from_path("file.txt").best()
print(result.encoding)

Важно: на коротких файлах (1–2 строки) определение почти всегда ненадёжно.


4. Проверка валидности UTF-8

UTF-8 имеет строгую структуру байт, поэтому его можно проверить точно.

Linux / macOS

iconv -f UTF-8 -t UTF-8 file.txt > /dev/null && echo "Valid UTF-8" || echo "Not UTF-8"

Python

data = open("file.txt", "rb").read()
try:
    text = data.decode("utf-8")
    print("Это валидный UTF-8")
except UnicodeDecodeError as e:
    print("Не UTF-8:", e)

Если файл содержит только ASCII, он будет валидным и как UTF-8, и как CP1251, и как KOI8-R. Для ASCII-файлов кодировка неразличима.


5. Проверка в редакторах

Notepad++

  1. Откройте файл.
  2. Меню Encoding.
  3. Если текст битый, выберите:
    • Character sets -> Cyrillic -> Windows-1251
    • KOI8-R
    • ISO-8859-5
    • UTF-8
  4. Когда текст станет читаемым — это искомая кодировка.
  5. Для конвертации: Encoding -> Convert to UTF-8 (именно Convert, а не Encode in UTF-8).

VS Code

  1. В правом нижнем углу нажмите на текущую кодировку.
  2. Выберите Reopen with Encoding.
  3. Перебирайте варианты, пока текст не станет нормальным.
  4. Затем Save with Encoding -> UTF-8.

Sublime Text / Atom / Kate

Аналогично: ищите пункт Reopen with Encoding или Set Encoding.


6. Проверка через Python: перебор кодировок

Осторожно:

Однобайтовые кодировки (CP1251, KOI8-R) декодируют почти любые байты без ошибок. Поэтому смотрите не только на отсутствие ошибок, но и на читаемость текста.


from pathlib import Path

data = Path("file.txt").read_bytes()

for enc in ["utf-8-sig", "utf-8", "cp1251", "koi8-r", "iso-8859-5", "utf-16", "utf-16-le", "utf-16-be"]:
    try:
        text = data.decode(enc)
        print(f"{enc:12} OK: {text[:80]!r}")
    except UnicodeDecodeError as e:
        print(f"{enc:12} FAIL: {e}")

Для русского текста правильная кодировка обычно даёт читаемые слова:

  • 'Привет, мир!' Неправильная — кракозябры:
  • 'Привет'
  • 'Ïðèâåò'
  • 'ðÁÒÉ×ÅÔ'



7. Конвертация в UTF-8

Linux / macOS

iconv -f WINDOWS-1251 -t UTF-8 file.txt > file_utf8.txt

Если исходник UTF-16:

iconv -f UTF-16LE -t UTF-8 file.txt > file_utf8.txt

Убрать BOM у UTF-8:

sed '1s/^\xEF\xBB\xBF//' file.txt > file_nobom.txt

Python

from pathlib import Path

data = Path("file.txt").read_bytes()
text = data.decode("cp1251")          # или другая кодировка
Path("file_utf8.txt").write_text(text, encoding="utf-8")

PowerShell

$text = [IO.File]::ReadAllText("file.txt", [Text.Encoding]::GetEncoding(1251))
[IO.File]::WriteAllText("file_utf8.txt", $text, [Text.UTF8Encoding]::new($false))

8. Частые ошибки и нюансы

  • Нет BOM — нет гарантии. Даже мощные детекторы ошибаются.
  • Короткий файл — определение почти невозможно.
  • ASCII-файл — кодировка неразличима.
  • file может писать ISO-8859, хотя реально это Windows-1251. Это нормально: file часто не различает однобайтовые кириллические кодировки.
  • CP1251 декодирует всё без ошибок. Ошибка декодирования — не единственный критерий.
  • BOM в UTF-8 может мешать в Linux/скриптах, но помогает Windows Notepad.
  • UTF-8 без BOM — стандарт для Linux, web и большинства современных систем.

9. Шпаргалка

# BOM
xxd -l 4 file.txt

# Автоопределение
file --mime-encoding file.txt
uchardet file.txt
enca -L ru file.txt

# UTF-8?
iconv -f UTF-8 -t UTF-8 file.txt > /dev/null && echo OK

# Python
python -c "import chardet; print(chardet.detect(open('file.txt','rb').read()))"

# Конвертация
iconv -f CP1251 -t UTF-8 file.txt > out.txt

Если нужно точно — проверяйте BOM, валидность UTF-8 и визуально подтверждайте кодировку в Notepad++ или VS Code. Для русских .txt чаще всего встречаются: UTF-8, UTF-8 with BOM, Windows-1251, реже KOI8-R и ISO-8859-5.


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


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

Комментарии

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