Конвертер кодировок текста

ISO-8859-1: кодировка по умолчанию, которую никто не выбирал

Перекодировать текст из ISO-8859-1 ↓

Наверняка вам попадалось на глаза загадочное сочетание "é". Оно встречается в названиях французских кафе на картах, в фамилиях на почтовых конвертах, в чеках, в субтитрах и даже на рекламных щитах. Это след одной из самых живучих ошибок в истории компьютеров: букву "é", записанную в UTF-8, какая-то программа прочитала по правилам ISO-8859-1. Сама кодировка, известная также под коротким именем Latin-1, давно не считается современной, однако её отпечатки до сих пор разбросаны по всему цифровому миру.

Стандарт ISO-8859-1 был утверждён в 1987 году и опирался на более ранние разработки, прежде всего на многоязычный набор символов компании DEC, созданный для её терминалов. Замысел был скромным и разумным: взять свободную верхнюю половину восьмибитной таблицы и разместить там буквы, которых недостаёт в ASCII для записи западноевропейских языков. Так в кодировке появились французские гласные с акцентами, немецкие умлауты, испанская "ñ", скандинавские "å" и "ø", португальские носовые, исландские "þ" и "ð".

Latin-1 открывала целое семейство. Вслед за первой частью стандарта появились и другие, построенные по тому же чертежу: ISO-8859-2 для Центральной Европы, ISO-8859-5 для кириллицы, ISO-8859-7 для греческого и ещё около десятка таблиц. Судьбы у них сложились по-разному. Кириллическая часть, например, практически не прижилась и проиграла KOI8-R и Windows-1251. Зато первая часть оказалась настолько востребованной, что на долгие годы превратилась в негласный стандарт всего западного мира.

Произошло это почти без чьего-либо сознательного решения. Когда создавались основные протоколы интернета, их авторы работали в Западной Европе и Северной Америке, и Latin-1 была для них естественным выбором. Её записали как кодировку по умолчанию в спецификацию протокола HTTP, она подразумевалась в ранних версиях HTML и в электронной почте. Если сайт или письмо ничего не сообщали о своей кодировке, программа считала текст написанным в ISO-8859-1. Даже популярная база данных MySQL вплоть до недавних версий создавала таблицы в варианте Latin-1, причём с правилами сортировки для шведского языка, поскольку её разработчики были из Швеции.

Самое же долговечное наследство кодировка оставила внутри Юникода. Первые 256 номеров в нём полностью повторяют таблицу ISO-8859-1: символ, стоявший в Latin-1 на позиции 233, имеет номер 233 и в Юникоде. Это было сделано ради лёгкого перехода со старого стандарта на новый. Из этого совпадения вытекает полезное для программистов свойство: любая последовательность байтов является допустимым текстом в ISO-8859-1, и ошибки чтения здесь невозможны в принципе. Этим нередко пользуются, когда нужно пропустить через текстовую функцию произвольные данные, не потеряв ни одного байта.

При всей своей популярности Latin-1 была далека от совершенства. Во французском языке есть лигатура "œ", без которой не написать слова "сердце" и "сестра", но в таблицу она не попала. Финскому и эстонскому не хватило букв с галочкой. А когда в 1999 году Европа ввела единую валюту, выяснилось, что для знака евро в кодировке попросту нет места. Чтобы исправить эти упущения, была выпущена ISO-8859-15, она же Latin-9, в которой восемь редко используемых значков заменили недостающими буквами и символом евро. Широкого распространения она, впрочем, получить не успела.

Особого разговора заслуживают отношения ISO-8859-1 с Windows-1252. В стандарте ISO позиции с 128 по 159 отведены под управляющие коды, которые на экране никак не отображаются. Microsoft сочла это расточительством и поместила туда типографские кавычки, длинное тире, многоточие, знак торговой марки, а позднее и евро. Во всём остальном таблицы одинаковы. Различие кажется мелким, но оно породило массу недоразумений: страницы, объявленные как ISO-8859-1, на деле содержали символы из Windows-1252. В конце концов разработчики браузеров сдались, и сегодня веб-стандарты прямо предписывают обрабатывать метку "iso-8859-1" как Windows-1252.

Вернёмся к загадочному "é". В UTF-8 буква "é" занимает два байта, и каждый из них, прочитанный по таблице Latin-1, превращается в самостоятельный знак. Тот же механизм превращает русское слово в длинную цепочку из букв "Ð" и "Ñ", перемежаемых мелкими значками. Иногда ошибка совершается дважды подряд: испорченный текст сохраняют, снова принимают за Latin-1 и перекодируют ещё раз, после чего одна буква раздувается до четырёх и более символов. Такое "двойное кодирование" знакомо каждому, кто переносил старые сайты и базы данных.

Сегодня доля страниц в ISO-8859-1 сократилась до процента с небольшим, а подавляющее большинство сайтов перешло на UTF-8. Тем не менее по числу сохранившихся документов Latin-1 остаётся самой заметной из старых кодировок: в ней хранятся архивы электронной почты, исходные коды программ прошлых десятилетий, библиографические базы и миллионы текстовых файлов. Узнать её несложно. Если в тексте на европейском языке вместо букв с акцентами стоят пары из "Ã" и случайного значка, значит, где-то по дороге UTF-8 приняли за Latin-1, и документ нужно перекодировать в обратном направлении.