Перекодировать текст из ISO-8859-15 ↓
Иногда стандарт приходится чинить уже после того, как им пользуются миллионы людей. Так случилось с ISO-8859-1, самой популярной западноевропейской кодировкой. К концу 1990-х годов стало очевидно, что в ней не хватает нескольких важных символов, а главное, в ней нет знака евро, единой валюты, которую Европа готовилась ввести в 1999 году. Исправленная версия получила название ISO-8859-15, а неофициально её стали называть Latin-9.
Новая кодировка почти полностью повторяет Latin-1. Все буквы с акцентами, умлаутами и другими знаками остались на прежних местах, поэтому большинство текстов на французском, немецком, испанском или итальянском выглядит в обеих кодировках одинаково. Изменения коснулись всего восьми позиций. Разработчики выбрали символы, которые почти никогда не использовались в реальных текстах, и заменили их недостающими буквами и знаками.
Список замен показателен. На место символа валюты общего назначения "¤" встал знак евро. Знаки дробей, одна вторая и одна четвёртая, уступили место французской лигатуре "œ" в строчном и заглавном вариантах. Без неё невозможно правильно написать такие слова, как "cœur" и "sœur", то есть "сердце" и "сестра", а в Latin-1 её почему-то не оказалось. Кроме того, в таблицу добавили финские и эстонские буквы "Š" и "Ž", а также французскую заглавную "Ÿ", встречающуюся в некоторых географических названиях.
Получилась вполне логичная и удобная таблица, но распространиться ей помешали обстоятельства. В Windows к тому времени уже давно работала кодировка Windows-1252, где знак евро и все недостающие буквы тоже были, только размещённые в диапазоне с 128 по 159, который в стандартах ISO отведён под управляющие коды. Пользователи Windows просто не нуждались в Latin-9. Поддержку новой кодировки получили в основном Unix-системы, где она какое-то время применялась в европейских локалях.
Поскольку ISO-8859-15 и ISO-8859-1 различаются лишь в восьми позициях, ошибки при их смешении малозаметны, но коварны. Знак евро, записанный в Latin-9 и прочитанный как Latin-1, превращается в "¤", лигатура "œ" становится знаком "½", а буква "Š" превращается в вертикальную черту с разрывом "¦". В обратную сторону случается обратное: в документе, где на самом деле стояли дроби, вдруг появляются буквы "œ" и "Œ". Цена товара "100 €" может незаметно превратиться в "100 ¤", и такую ошибку легко пропустить при беглом чтении.
С Windows-1252 путаница выглядит иначе. Знак евро в Windows-1252 имеет код 128, а в ISO-8859-15 код 164. Поэтому текст с евро, перенесённый из одной кодировки в другую без преобразования, либо теряет этот символ, либо получает на его месте "¤". Кроме того, Windows-1252 содержит типографские кавычки и тире, которых в Latin-9 нет вовсе, и при переводе текста в ISO-8859-15 их приходится заменять прямыми кавычками и дефисами.
Судьба Latin-9 типична для поздних однобайтовых стандартов. Она появилась почти одновременно с Юникодом, который решал ту же задачу гораздо шире: в UTF-8 есть и знак евро, и все европейские буквы, и вообще символы почти всех письменностей мира. Когда Linux-дистрибутивы перешли на UTF-8, необходимость в ISO-8859-15 отпала, и сегодня её доля на сайтах измеряется долями процента.
Тем не менее кодировка до сих пор встречается в старых конфигурационных файлах, письмах, исходных кодах программ и экспортах из баз данных европейских компаний. Если в тексте вместо знака евро стоит "¤" или вместо "œ" появляется "½", скорее всего, документ был записан в ISO-8859-15, а прочитан как ISO-8859-1. Укажите правильную исходную кодировку и преобразуйте текст в UTF-8, и все символы встанут на свои места.