Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Юникодные часы

В Юникоде есть несколько символов часов (не знаю, отобразятся ли они у вас, вот они): «🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦🕛🕧.»

Тут, как видите, шаг полчаса. Я вчера за завтраком сделал Юникодные часы, которые «ходят» поворотом символа (через ЦСС-трансформации). Часовая стрелка очень некрасиво скачет (я только для Вебкита делал и испытывал только в Сафари), потому что мне приходится вращать символ, чтобы минутная стрелка двигалась, а потом переходить на следующий символ. В общем, просто разминка для пальцев.

Юникодные часы (3.72КиБ)

Рассказать я хотел не об этом. Я и раньше встречался с тем, что часть Юникода не воспринимается многими программами нормально, особенно что касается раздела «Эмодзи, например „Яндекс.Фотки“ не так давно порадовали меня следующим (стоило переименовать картинку, всё стало в порядке):

«Яндекс.Фотки» (52.51КиБ)

Редактор „Сублиме Текст 2“ часто падает, если в тексте программы встречаются эти символы, а вот „Сафари“ удивил больше всех. Он их, вроде бы, понимает, но как-то не до конца:

"🕐".length; // 2
'🕐'[0]; // строка со «сломанным» символом
escape('🕐'); // "%uD83D%uDD50"

То есть, он считает символы Эмодзи не одним символом, а двумя. Такой вот баг. Мне пришлось в коде на ДжаваСкрипте это учитывать.

Дополнение: в комментариях подсказывают, что вроде так и задумано. Так как этим символы представлены четырьмя байтами (суррогатной парой), ДжаваСкрипт, который не умеет работать с такой парой как с одним символом, разделяет его на два.

6 комментариев
Бабаев Александр (bealex.moikrug.ru) 2013

Это 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

Роман Комаров 2013

Насколько я помню, это не баг, а фича: http://mathiasbynens.be/notes/javascript-encoding

Евгений Степанищев (bolknote.ru) 2013

Комментарий для bealex.moikrug.ru:

Это utf-16 ескейпинг

Суррогатные пары, наверное?

Бабаев Александр (bealex.moikrug.ru) 2013

Комментарий для Евгения Степанищева:

Суррогатные пары, наверное?

Да, наверное, я в терминологии не силен. :)

Александр Карпинский 2013

Все верно, суррогатные пары. Используются для хранения символов с большими индексами в реализациях, где символ представляется только 16 битами. Позволяют хранить дополнительно 20 бит (по 10 значащих бит в каждом символе пары).

Евгений Степанищев (bolknote.ru) 2013

Комментарий для Александр Карпинский:

Я знаю, что такое суррогатные пары ( http://bolknote.ru/all/2092/ ), но не ожидал что JS зачем-то разделит один, по сути символ, на два. Ведь строка в JS хранит именно символы.