Юникодные часы
В Юникоде есть несколько символов часов (не знаю, отобразятся ли они у вас, вот они): «🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦🕛🕧.»
Тут, как видите, шаг полчаса. Я вчера за завтраком сделал Юникодные часы, которые «ходят» поворотом символа (через ЦСС-трансформации). Часовая стрелка очень некрасиво скачет (я только для Вебкита делал и испытывал только в Сафари), потому что мне приходится вращать символ, чтобы минутная стрелка двигалась, а потом переходить на следующий символ. В общем, просто разминка для пальцев.
Рассказать я хотел не об этом. Я и раньше встречался с тем, что часть Юникода не воспринимается многими программами нормально, особенно что касается раздела «Эмодзи, например „Яндекс.Фотки“ не так давно порадовали меня следующим (стоило переименовать картинку, всё стало в порядке):
Редактор „Сублиме Текст 2“ часто падает, если в тексте программы встречаются эти символы, а вот „Сафари“ удивил больше всех. Он их, вроде бы, понимает, но как-то не до конца:
"🕐".length; // 2
'🕐'[0]; // строка со «сломанным» символом
escape('🕐'); // "%uD83D%uDD50"
То есть, он считает символы Эмодзи не одним символом, а двумя. Такой вот баг. Мне пришлось в коде на ДжаваСкрипте это учитывать.
Дополнение: в комментариях подсказывают, что вроде так и задумано. Так как этим символы представлены четырьмя байтами (суррогатной парой), ДжаваСкрипт, который не умеет работать с такой парой как с одним символом, разделяет его на два.
Это utf-16 ескейпинг. Вот информация из Character Viewer’а.
🕐 CLOCK FACE ONE OCLOCK Unicode: U+1F550 (U+D83D U+DD50), UTF-8: F0 9F 95 90
А вот тут я нашел все варианты его кодирования в разных кодировках: http://www.fileformat.info/info/unicode/char/1f550/index.htm
Насколько я помню, это не баг, а фича: http://mathiasbynens.be/notes/javascript-encoding
Комментарий для bealex.moikrug.ru:
Суррогатные пары, наверное?
Комментарий для Евгения Степанищева:
Да, наверное, я в терминологии не силен. :)
Все верно, суррогатные пары. Используются для хранения символов с большими индексами в реализациях, где символ представляется только 16 битами. Позволяют хранить дополнительно 20 бит (по 10 значащих бит в каждом символе пары).
Комментарий для Александр Карпинский:
Я знаю, что такое суррогатные пары ( http://bolknote.ru/all/2092/ ), но не ожидал что JS зачем-то разделит один, по сути символ, на два. Ведь строка в JS хранит именно символы.