qatoolqa.ru

Кракозябры: определение и починка кодировки

Текст пришёл в виде «ÐŸÑ€Ð¸Ð²ÐµÑ‚» или «Ïðèâåò»? Вставьте его — страница подберёт исходную кодировку и покажет варианты расшифровки. Поддерживаются UTF-8, windows-1251, KOI8-R, CP866, работа с BOM. Перекодировка идёт локально: логи и выгрузки с рабочими данными не уходят на сервер.

Текст

Починка

Если прочитать не той кодировкой

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. Прогоните обратную цепочку в два шага — страница это позволяет.