Текст
Починка
Если прочитать не той кодировкой
HTML-сущности
Откуда берутся кракозябры
Кодировка — это таблица. Она говорит, каким числом записана каждая буква. Слово «Привет» в UTF-8 занимает 12 байт, в Windows-1251 — шесть. Одно слово, разные байты.
Беда случается, когда записали одной таблицей, а прочитали другой. Байты те же, а буквы по ним находятся не те. Самый частый случай: текст сохранён в UTF-8, а прочитан как Windows-1251 — так «Привет» превращается ⠫Привет». Инструмент подбирает эту пару и проделывает путь обратно.
Не всё чинится. Если при чтении байты не просто перепутались, а потерялись — а так бывает, когда неподходящий байт заменяют знаком «�», — исходное не восстановить ничем. Знак замены назад не превращается. Поэтому кракозябры лучше ловить в той системе, где они появились, а не в конце цепочки.
Чем это отличается от Base64. Base64 отвечает на вопрос «как передать байты там, где ждут текст», и всегда обратим одним и тем же способом. Кодировка отвечает на вопрос «какими байтами записан текст», и вариантов таблиц десятки. Разные задачи: там упаковка, тут прочтение.
Что стоит знать
Обратно в старую кодировку — нельзя. Браузер умеет читать текст в трёх десятках кодировок, но записывать умеет только в UTF-8: TextEncoder другого не поддерживает. Это ограничение движка, а не инструмента. Поэтому колонка байтов для старых кодировок собрана вручную, по обратной таблице, и работает только для однобайтовых.
ISO 8859-1 — не то, чем кажется. Браузер молча читает её как Windows-1252: так требует стандарт кодировок, потому что в реальном вебе под этим именем почти всегда лежала именно 1252. Проверено — new TextDecoder('iso-8859-1').encoding возвращает windows-1252.
BOM в начале файла. Три байта EF BB BF помечают UTF-8. Часть систем их показывает как невидимый символ, часть спотыкается: JSON.parse на файле с BOM падает с ошибкой в позиции 0. Строки-ловушки с BOM есть в наборе на странице Строки-ловушки.
Одинаковых букв в разных таблицах нет. Кириллическая «А» и латинская «A» выглядят одинаково, но это разные символы с разными байтами в любой кодировке. Логин из латинской «a» и логин из кириллической — разные логины, и на этом ловят и пользователей, и системы.
Частые вопросы
Как страница угадывает исходную кодировку?
Перебирает варианты и оценивает, насколько результат похож на осмысленный русский текст. Итог показывается со всеми вариантами — выбираете вы, а не алгоритм.
Excel открывает CSV кракозябрами — что делать?
Excel по умолчанию ждёт windows-1251 или UTF-8 с BOM. Перекодируйте файл здесь и добавьте BOM, либо импортируйте через «Данные → Из текста» с явным указанием кодировки.
А если текст уже сломан дважды?
Бывает: UTF-8 прочитали как 1251, а потом снова сохранили в UTF-8. Прогоните обратную цепочку в два шага — страница это позволяет.