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

Windows-1250: кодировка для языков Центральной Европы

Перекодировать текст из WINDOWS-1250 ↓

Латинский алфавит принято считать простым: двадцать шесть букв, знакомых каждому со школы. Но стоит взглянуть на чешскую, польскую или венгерскую газету, и становится ясно, что этих букв народам Центральной Европы категорически не хватило. Над привычными знаками появляются галочки, кружки и двойные штрихи, снизу к ним прирастают хвостики, а одну из букв и вовсе перечёркивает косая черта. Для всего этого богатства в начале 1990-х годов компания Microsoft создала отдельную кодовую страницу, получившую номер 1250.

По номеру легко догадаться, что перед нами ближайшая родственница Windows-1251 и Windows-1252. Все три таблицы появились одновременно и построены по единому образцу: один байт на символ, нижняя половина повторяет ASCII, верхняя отдана национальным буквам и типографским знакам. Различается только содержимое верхней половины. В Windows-1252 там живут буквы западноевропейских языков, в Windows-1251 разместилась кириллица, а Windows-1250 собрала под одной крышей письменности стран, лежащих между Германией и бывшим Советским Союзом.

Список языков получился внушительным: польский, чешский, словацкий, венгерский, словенский, хорватский, боснийский, румынский, албанский, а также сербский в его латинской записи. Сербский язык вообще оказался в любопытном положении, ведь он официально пользуется двумя алфавитами, и тексты на кириллице требовали Windows-1251, а на латинице уже Windows-1250. Заодно в таблицу попали немецкие умлауты и буква "эсцет", так что немецкий текст в ней тоже набирается без затруднений.

Чтобы оценить масштаб задачи, достаточно перечислить, что именно пришлось уместить в сто с небольшим свободных ячеек. Чешские и словацкие буквы с "гачеком", той самой галочкой, которая превращает "c" в "ч", а "s" в "ш". Польские носовые гласные с хвостиком, называемым "огонек", и перечёркнутую букву "ł". Венгерские гласные с двойным акутом, которых нет больше ни в одном крупном европейском языке. Румынские согласные с подстрочным знаком. При этом в таблице остались и кавычки разных начертаний, и тире, и знак параграфа.

Windows-1250 не была первой попыткой решить эту задачу. Несколькими годами раньше международная организация по стандартизации утвердила ISO-8859-2, известную также как Latin-2. Набор букв в обеих кодировках практически совпадает, однако часть из них стоит на разных местах. Для польского языка расхождение затрагивает три буквы в заглавном и строчном вариантах, для чешского и словацкого несколько букв с гачеком. В результате текст, открытый не в той из двух таблиц, выглядит почти правильным, но отдельные буквы в словах подменяются посторонними значками. Такая "почти правильность" делала ошибку особенно коварной: её не всегда замечали сразу.

Были у Windows-1250 и другие соперники. В MS-DOS для тех же языков служила кодовая страница CP852, сохранившая часть псевдографики для рисования рамок. Кроме неё, едва ли не в каждой стране успели появиться собственные решения: в Польше была популярна кодировка Mazovia, в Чехословакии кодировка братьев Каменицких. Польские программисты 1990-х годов любили вспоминать, что способов записать девять национальных букв существовало больше десятка, и каждая программа поддерживала свой набор.

Самая распространённая ошибка возникала тогда, когда центральноевропейский текст попадал на компьютер с западноевропейскими настройками. Латинские буквы без диакритики при этом оставались на местах, а вот остальные подменялись. Польское слово "żółw", то есть "черепаха", превращалось в "¿ó³w", а чешское "řeč", означающее "речь", выглядело как "øeè". Если же такой файл открывали на русском компьютере, где по умолчанию действовала Windows-1251, посреди латинских слов возникали кириллические буквы, и "řeč" читалось как "шeи". Зрелище получалось странное, но вполне поддающееся расшифровке.

Нельзя сказать, что кодировка справилась со своей задачей безупречно. Самый известный её изъян касается румынского языка. По правилам румынской орфографии под буквами "s" и "t" должна стоять запятая, однако в Windows-1250, как и в ISO-8859-2, вместо неё использована седилья, знак похожий, но другой. Долгие годы румынские тексты набирались формально неправильными буквами, и последствия этой путаницы до сих пор встречаются в документах и базах данных. Исправить положение удалось только с приходом Юникода, где оба варианта получили отдельные номера.

Юникод и положил конец эпохе региональных кодовых страниц. В UTF-8 польская, чешская, русская и греческая буквы могут стоять в одном предложении, и ни одной программе не нужно гадать, какую таблицу применить. За эту свободу буквы с диакритикой платят вторым байтом, а текст на венгерском или чешском становится длиннее на несколько процентов, что давно никого не смущает. Windows-1250 тем временем перешла в разряд унаследованных форматов. Её до сих пор можно встретить в старых бухгалтерских программах, в субтитрах к фильмам, в CSV-файлах, выгруженных из офисных пакетов, и в архивах сайтов, созданных два десятилетия назад.

Если в польском или чешском тексте вместо букв с хвостиками и галочками стоят значки дробей, перевёрнутые вопросительные знаки или неожиданная кириллица, почти наверняка перед вами Windows-1250, прочитанная по чужой таблице. Достаточно указать её в качестве исходной кодировки и преобразовать текст в UTF-8, чтобы все гачеки и огонеки вернулись на свои законные места.