Подробный гайд по проверке кодировки .txt
Главное:
В обычном .txt нет метаданных о кодировке. Точно определить её можно только если есть BOM (метка порядка байтов). Во всех остальных случаях это эвристика: утилиты и редакторы угадывают, а вы проверяете глазами.
1. Быстрый алгоритм
- Проверьте первые байты файла — есть ли BOM.
- Если BOM есть — кодировка известна.
- Если BOM нет — проверьте, валиден ли UTF-8.
- Если UTF-8 невалиден — проверьте типичные кодировки:
Windows-1251,KOI8-R,ISO-8859-5. - Откройте файл в редакторе и переключите кодировку вручную.
- Убедитесь, что русский текст читается:
Привет, а неПриветили�����. - При необходимости конвертируйте в 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++
- Откройте файл.
- Меню
Encoding. - Если текст битый, выберите:
Character sets -> Cyrillic -> Windows-1251KOI8-RISO-8859-5UTF-8
- Когда текст станет читаемым — это искомая кодировка.
- Для конвертации:
Encoding -> Convert to UTF-8(именно Convert, а не Encode in UTF-8).
VS Code
- В правом нижнем углу нажмите на текущую кодировку.
- Выберите
Reopen with Encoding. - Перебирайте варианты, пока текст не станет нормальным.
- Затем
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.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.