войти зарегистрироваться

Блог компании Mail.Ru GroupПочта Mail.Ru (даже если ты китаец)

Хотим поделиться радостью: мы успешно перевели нашу почту на UTF-8. Теперь можно спокойно переписываться с арабами, китайцами, японцами, греками, грузинами, писать письма на иврите и идише, блеснуть знанием финикийской письменности или зашифровать послание нотами. И при этом быть уверенным, что адресат получит именно то, что ему отправили, а не квадратики или «кракозябры».

Как и многие серьезные изменения, процесс перехода потребовал серьезной подготовки и имел большую «подводную» часть – перед разработчиками стояла задача обработать 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-заголовке

Есть у меня старый сайт на Народ.Ру, и недавно я закинул туда несколько статей — как это я теперь делаю в UTF-8. Кодировка была указана в теге meta, но, взглянув на страницы, я увидел крякозябры: «Р§С‚Рѕ-то случилось.» Оказывается, Народ.Ру шлёт HTTP-заголовок Content-Type: text/html; charset=windows-1251 и это на нём никак не отключается. Пользователь может получить читабельный текст — только если догадается вручную переключить кодировку в браузере.

Что делать? Переходить на другой хостинг? Само собой, но пока руки не дошли, хотелось добиться результата тут. Перекодировать тексты? Более достойным и интересным показалось поставить Javascript-«заплатку».

Способа переключить кодировку из Javascript я не нашёл. Остался вариант перекодировать текст скриптом, запускаемым по событию onready документа.

Итак, браузер получает текст в UTF-8, разбивает UTF-последовательности на группы по 8 бит и трактует их как коды символов в кодировке Windows-1251. Чтобы восстановить читаемость текста, нужно получить эти коды, объединить их в UTF-последовательности, а из них — восстановить Unicode-коды символов и вернуть последние посредством числовых ссылок HTML на символы. В этом деле обнаружились несколько закавык.

SilverlightSilverlight и кодировки

Silverlight довольно удобен тем, что предоставляет почти «полноценный» .net в клиентских приложениях. Если бы не это «почти», то всё было бы замечательно. Недавно мне понадобилась необходимость использовать одну .net-библиотеку. Я начал с того, что переставил настройки проекта на silverlight и добавил её к основному проекту. Приложение откомпилировалось и я уже обрадовался, что вот так легко можно использовать уже имеющиеся наработки, но радоваться было рано...

Персональные блоги AJAX, IE и CP1251

Делал я тут как-то пое-чего на аяксе, передавал данные в JSON'е, кодировка всего на сайтине — cp1251. Дабы не изобретать велосипед использовал jQuery. Все отлично работало пока я не решил протестить все в IE. IE у меня седьмой версии, в других не проверял пока, но по-моему там та же фича.

Так вот, ничего не работало безовсяких ошибок (видимых). Покопавшись выяснил что jQuery возвращает parsererror. Покопавшись глубже выяснил что транспорт выпадает с эксепшеном при доступе к полю responseText а поле responseXML содержит пустой документ (что естественно, данные передаются текстом).

Поработав лобзиком и гуглем с полчаса методом тыка выяснил что:

  1. ежели кодировка с заголовках стоит не utf-8 IE отказывается работать абсолютно;
  2. тип контента 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.