Блог компании Mail.Ru Group → Почта Mail.Ru (даже если ты китаец)
Как и многие серьезные изменения, процесс перехода потребовал серьезной подготовки и имел большую «подводную» часть – перед разработчиками стояла задача обработать 6 петабайт писем в более чем сотне миллионов ящиков. Первые эксперименты начались осенью 2010 года, и весной 2011 все ящики были успешно переведены на новую систему. Одновременно с этим символично сменился домен проекта «почта»: вместо основного домена win.mail.ru и исторических koi.mail.ru и mac.mail.ru, которые выдавали сайт в соответствующих кодировках, теперь используется e.mail.ru, выдающий все страницы в UTF-8. Вся почта также хранится, обрабатывается и выводится в UTF-8. Это означает, что в письмах можно использовать любые живые и мертвые языки, математические и нотные символы, причем как в виде plain-text, так и с форматированием.
Чтобы напомнить, как обстояли дела с международным общением еще недавно, мы подготовили небольшой экскурс в историю кодировок.
Вначале была цифра
Удивительно, но проблема кодировки сообщений, которая в восьмидесятых мучила первых сетевых пользователей, а в девяностых была бичом зарождающегося Рунета, возникла задолго до появления компьютера. Одним из самых первых ростков информационного века был телеграф, и сейчас нужно некоторое усилие, чтобы вспомнить, что способ связи, возникший еще до телефона, был изначально цифровым. Не считая в чистом виде двоичной азбуки Морзе, первым кодом, превратившимся в стандарт, стал код Бодо. Этот 5-битный синхронный код позволял телеграфам передавать примерно 190 знаков в минуту (а в последствие до 760) или 16 бит в секунду. Кстати, те, кто покупал первые модемы, помнят, что скорость значилась именно в бодах – единицах измерения имени Эмиля Бодо, изобретателя кода и высокоскоростного телеграфного аппарата.
JavaScript → Как отобразить страницу в UTF-8, несмотря на windows-1251 в HTTP-заголовке
meta, но, взглянув на страницы, я увидел крякозябры: «Р§С‚Рѕ-то случилось.» Оказывается, Народ.Ру шлёт HTTP-заголовок Content-Type: text/html; charset=windows-1251 и это на нём никак не отключается. Пользователь может получить читабельный текст — только если догадается вручную переключить кодировку в браузере.Что делать? Переходить на другой хостинг? Само собой, но пока руки не дошли, хотелось добиться результата тут. Перекодировать тексты? Более достойным и интересным показалось поставить Javascript-«заплатку».
Способа переключить кодировку из Javascript я не нашёл. Остался вариант перекодировать текст скриптом, запускаемым по событию
onready документа.Итак, браузер получает текст в UTF-8, разбивает UTF-последовательности на группы по 8 бит и трактует их как коды символов в кодировке Windows-1251. Чтобы восстановить читаемость текста, нужно получить эти коды, объединить их в UTF-последовательности, а из них — восстановить Unicode-коды символов и вернуть последние посредством числовых ссылок HTML на символы. В этом деле обнаружились несколько закавык.
Silverlight → Silverlight и кодировки
Персональные блоги → AJAX, IE и CP1251
Делал я тут как-то пое-чего на аяксе, передавал данные в JSON'е, кодировка всего на сайтине — cp1251. Дабы не изобретать велосипед использовал jQuery.
Все отлично работало пока я не решил протестить все в IE. IE у меня седьмой версии, в других не проверял пока, но по-моему там та же фича.
Так вот, ничего не работало безовсяких ошибок (видимых). Покопавшись выяснил что jQuery возвращает parsererror. Покопавшись глубже выяснил что транспорт выпадает с эксепшеном при доступе к полю responseText а поле responseXML содержит пустой документ (что естественно, данные передаются текстом).
Поработав лобзиком и гуглем с полчаса методом тыка выяснил что:
- ежели кодировка с заголовках стоит не
utf-8IEотказывается работать абсолютно; - тип контента
application/ajaxиapplication/x-javascriptтоже не рулят.
В общем в конце концов стал выдавать заголовок Content-type: text/plain; charset=utf-8 и перекодировать все в utf-8 (благо с iconv это вышло тремя строчками).
Нет, я конечно читал что IE не дружит с виндовой же кодировкой cp1251 но пока разобрался ;)
Люди! Не повторяйте чужих ошибок :)
UPD
Мда, посыпаю голову пеплом. Оказалось, что все довольно неплохо исправляется заменой кодировки cp1251 на windows-1251 :) Спасибо за совет.
Персональные блоги → Кодировки must die
«KOI8», — подумал Штирлиц.
Как подсказал Яндекс, в самом полном словаре иероглифов корейского языка, подготовленном около тысячи лет назад, было учтено около 53 тысяч знаков. Тяжело им, наверно, корейцам. В русском же языке другая проблема: всего 33 буквы, но зато кодировок… кто-то их считал? Я нет. В опере 4, файерфокс предлагает на выбор 7.