Webrium
Подписаться

Почему текст превращается в кракозябры

Испорченный текст почти никогда не испорчен: его читают не той таблицей, какой записали. Что делать и чего не делать ни в коем случае.

Текст цел: числа те же, а таблица соответствия другаята же записьдругая таблица

Открываешь файл, а вместо русских слов — ряды вопросительных знаков, квадратиков или бессмысленных латинских букв с крышечками. Ощущение, что текст испортился. На самом деле с ним ничего не случилось: он в порядке, просто его читают не тем способом, каким записали.

Компьютер не хранит буквы

Внутри всё — числа. Буква «а» хранится как число, «б» — как другое. Чтобы из чисел получились буквы, нужна таблица соответствия: какое число какой букве отвечает.

Такая таблица и называется кодировкой. Записали текст по одной таблице, читаете по другой — получаете не те буквы. Числа те же самые, а слова другие.

Отсюда всё остальное: испорченный текст почти никогда не испорчен. Он просто прочитан не той таблицей, и если взять правильную, он вернётся целиком.

Почему таблиц много

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

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

Пока текст оставался внутри страны, это работало. Как только тексты начали ходить между странами, начались квадратики: файл записан по одной национальной таблице, а открывают его по другой.

Потом придумали общую таблицу, куда поместились все алфавиты сразу. Она называется юникод, и сегодня почти всё пользуется ею. Почти — ключевое слово: старые файлы, старые программы и старое оборудование продолжают жить по прежним правилам.

У общей таблицы есть особенность, которая объясняет часть странностей. Она описывает, какой номер у какой буквы, но не то, как этот номер записывать в файл. Способов записи несколько, и самый распространённый устроен экономно: привычные латинские буквы занимают одну ячейку, а всё остальное — две и больше.

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

Тупик: искать, чем «починить» файл

Первое, что пробуют, — найти программу, которая исправит испорченный текст. Иногда помогает, но чаще нет, и вот почему.

Если файл просто читается не той таблицей, чинить нечего: надо открыть его правильно, и всё встанет на места. Никакого исправления не требуется.

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

Отсюда правило: сначала попробовать открыть иначе, и только потом что-то менять. Сохранение неправильно прочитанного текста — единственное действие, которое превращает недоразумение в настоящую потерю.

Как это выглядит на практике

Есть узнаваемые признаки, по которым видно, что произошло.

Русский текст превратился в пары странных латинских букв с диакритикой — почти наверняка юникод прочитали как национальную таблицу. Восстанавливается.

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

Вместо букв знаки вопроса — хуже: часто это означает, что при сохранении буквы, которых не было в целевой таблице, заменили на вопросы. Восстановлению не подлежит.

Первые несколько символов файла выглядят как мусор, дальше всё нормально — это служебная пометка о кодировке, которую программа не поняла.

Отдельный случай — когда ломаются только некоторые буквы, а остальной текст в порядке. Обычно страдают буква «ё», кавычки-ёлочки, длинное тире и неразрывный пробел. Это признак того, что цепочка почти целиком работает правильно, а одно звено использует старую таблицу, где этих знаков просто нет.

Что с этим делать обычному человеку

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

Если вы отправляете файл другим, сохраняйте в юникоде. Это единственная таблица, которая одинаково понимается везде, и по умолчанию сейчас предлагается почти всюду.

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

И самое важное: не пересохраняйте файл, который отображается неправильно. Сначала добейтесь, чтобы он читался верно, и только потом сохраняйте.

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

Почему это до сих пор случается

Казалось бы, общая таблица есть, все ею пользуются, проблема должна была исчезнуть.

Она не исчезает, потому что тексты живут дольше программ. Файл, записанный много лет назад, продолжает открываться сегодня. Оборудование, печатающее чеки, может не знать новых таблиц. Программа, которую написали давно и не трогают, потому что работает, продолжает записывать по-старому.

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

Догадка при этом устроена не глупо: программа смотрит на числа и прикидывает, на какой язык это похоже. На длинном тексте она почти всегда права. На коротком — например, на имени файла или на одной строке в таблице — данных для догадки мало, и ошибается она именно там. Поэтому короткие подписи ломаются чаще длинных абзацев, хотя интуиция подсказывает обратное.

Позиция редакции

Мы считаем, что правильная реакция на непонятные буквы — не искать программу для исправления, а попробовать открыть файл иначе. В большинстве случаев текст цел, и его не надо чинить.

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

С чем это связано

Метка над заголовком говорит, зачем туда идти: продолжить тему, перейти к практике или увидеть возражение.

Выражение не сокращают, а разбирают на именованные части — как кодстрокисовпало
Углубление

Регулярное выражение, которое можно поддерживать

Глубже про выражения: что делает их читаемыми спустя годы и где регулярные выражения перестают быть подходящим инструментом.

Два маршрута ответа: короткий — готовый список названий программ, который быстро устаревает, и длинный — через пять ролей инструментов, который не стареетСписок названийПять ролей
Усиление

Чем программисты пользуются каждый день

Дополняет картину: пять ролей, которые инструменты играют в рабочем дне, вместо списка названий, который ничего не объясняет.

Шесть столбцов потерь времени в терминале: видимые потери — нажатия, опечатки, повторяемые пути — низкие, а невидимые — вспомнить команду, найти каталог, восстаЧасы — не в наборе
Предыстория

Терминал, который экономит часы, а не минуты

Что знать заранее: часы теряются не в наборе команд, поэтому быстрые эмуляторы и алиасы почти ничего не экономят.

Письмо по вторникам

Один разбор недели и короткий список того, что изменилось. Без дайджестов на сорок ссылок.

Начните вводить — материалы появятся здесь.

выбрать · Enter открыть · Esc закрыть