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

Windows-1252: западноевропейская кодировка, ставшая стандартом интернета

Перекодировать текст из Windows-1252 ↓

Если спросить, какая из старых однобайтовых кодировок важнее всех, ответ почти наверняка будет один: Windows-1252. В ней десятилетиями писали тексты на английском, французском, немецком, испанском, итальянском, португальском и скандинавских языках. Её же браузеры и сегодня используют по умолчанию для страниц, которые не сообщают свою кодировку. Номер 1252 знаком каждому, кто занимался переносом старых сайтов и баз данных.

Кодировка появилась вместе с первыми версиями Windows в конце 1980-х годов. Microsoft взяла за основу международный стандарт ISO-8859-1, известный как Latin-1, и сохранила все его буквы на тех же местах. Нижняя половина таблицы совпадает с ASCII, верхняя содержит буквы с акцентами, умлаутами и другими знаками, а также символы фунта, иены, параграфа и авторского права. Казалось бы, отличий от стандарта нет, однако одно важное различие всё-таки есть.

В ISO-8859-1 позиции с 128 по 159 отведены под управляющие коды, которые на экране ничего не показывают и почти никогда не используются. Microsoft сочла это расточительным и поместила в этот диапазон типографские символы: изогнутые кавычки, длинное и короткое тире, многоточие, знак торговой марки, знак промилле, крестики для сносок, а позднее и знак евро. Кроме того, туда попали буквы "Š", "Ž", "Œ" и "Ÿ", которых не хватало в Latin-1 для ряда европейских языков.

Это решение оказалось очень удачным для пользователей, но создало немало путаницы. Текстовые редакторы Windows автоматически превращали прямые кавычки в изогнутые, а дефисы в тире, и такие символы попадали в документы, письма и веб-страницы. При этом многие сайты объявляли свою кодировку как ISO-8859-1, хотя на деле содержали символы Windows-1252. В итоге разработчики браузеров перестали различать эти кодировки, и современный веб-стандарт прямо предписывает обрабатывать метку "iso-8859-1" как Windows-1252.

Самая известная ошибка, связанная с этой кодировкой, возникает при чтении текста в UTF-8 так, будто он записан в Windows-1252. Буква "é" занимает в UTF-8 два байта, и каждый из них превращается в отдельный символ, так что слово "café" выглядит как "café". Ещё узнаваемее судьба типографских кавычек и тире: открывающая кавычка превращается в сочетание "“", а тире в "–". Если вы видели в тексте странные последовательности, начинающиеся с "â€", перед вами именно этот случай.

Русский текст при такой ошибке тоже легко узнать. Буквы кириллицы в UTF-8 начинаются с байтов, которые в Windows-1252 соответствуют символам "Ð" и "Ñ", поэтому каждое русское слово превращается в длинную цепочку из этих двух букв вперемешку с другими знаками. Обратная путаница, когда текст в Windows-1252 читают как UTF-8, приводит к появлению знаков замены в виде ромбов с вопросительным знаком на месте каждого акцентированного символа или кавычки.

Ещё одна частая история связана с русскоязычными компьютерами. Если текст на французском или немецком в Windows-1252 открыть в программе, которая по умолчанию использует Windows-1251, вместо букв с акцентами появятся русские буквы. Немецкое слово "Größe" превратится в "GrцЯe", а французское "élève" в "йlиve". Такую ошибку легко узнать по кириллическим буквам, неожиданно стоящим внутри латинских слов.

Сегодня Windows-1252 постепенно уступает место UTF-8, но остаётся очень распространённой. В ней сохранены огромные массивы документов, электронной почты, субтитров и выгрузок из баз данных. Табличные редакторы во многих странах до сих пор сохраняют файлы CSV в этой кодировке, а старые программы и сайты продолжают с ней работать. Поэтому понимать, как она устроена, полезно любому, кто имеет дело с текстовыми данными.

Если в западноевропейском тексте вместо акцентированных букв стоят пары символов с "Ã" или "â€", значит, UTF-8 прочитали как Windows-1252, и текст нужно перекодировать в обратную сторону. Если же в латинских словах появились русские буквы, текст в Windows-1252 открыли как Windows-1251. В обоих случаях достаточно правильно указать исходную кодировку и преобразовать текст в UTF-8.