2013-11-18 2 views
2

Кто-нибудь знает, как Facebook кодирует эможи с парами с высоким суррогатом в Graph API?Как Facebook кодирует emoji в json Graph API?

Низкие суррогатные пары выглядят отлично. Например, ❤️ (HEAVY BLACK HEART, хотя оно красное в iOS/OSX, link to image if you can't see the emoji) появляется как \u2764\ufe0f, который, по-видимому, соответствует шестнадцатеричным кодам UTF-16/«Официальная нотация Unicode», показанному здесь, в iemoji.com.

И действительно, в Ruby, при анализе вывода JSON из API:

ActiveSupport::JSON.decode('"\u2764\ufe0f"') 

вы правильно получить:

"❤️" 

Однако, чтобы выбрать другой смайликов, (СПАТЬ СИМВОЛ, link to image here Facebook. возвращает \udbba\udf59.Это, кажется, соответствует ничто, что я могу найти в любых ресурсах юникода, например, this one at iemoji.com.

И когда я пытаюсь расшифровать в Ruby, используя тот же метод выше:

ActiveSupport::JSON.decode('"\udbba\udf59"') 

я получаю:

"" 

Любая идея, что здесь происходит?

+1

'\ u2764 \ ufe0f' не суррогатная пара, это нормальный характер Basic Multilingual Plane затем селектор вариации. Используя вариант, чтобы попытаться отличить, когда emoji должен отображаться как цветные значки, это уродливое новое дополнение в Unicode 6.2. '\ udbba \ udf59', похоже, является ошибкой, хотя ... соответствующий кодовый пример U + FEB59 является символом частного использования, которого вы не должны получать. – bobince

+0

Нет «пар с высоким суррогатом» и нет «низких суррогатных пар». Действительные суррогатные пары (в UTF-16) состоят из одного низкого суррогата и одного высокого суррогата (в указанном порядке). Ни один из символов в вашем первом примере не является суррогатом. –

+0

Я явно не понимаю этого достаточно хорошо, чтобы использовать правильный язык. Любой символ emoji, в котором работает юникод, выглядит как 'U + 2764'. Но тот, который выглядит как 'U + 1F4A4' (примечание 1), нет. – philoye

ответ

1

Отвечая на мой собственный вопрос, хотя большая часть кредита принадлежит @bobince за то, что он показал мне способ в комментариях выше.

Ответ: Facebook кодирует emoji с использованием кодировки Google, как показано на этом Unicode table.

Я создал рубиновый камень под названием emojivert, который может конвертировать из одной кодировки в другую, в том числе от «Google» до «Unified». Он основан на другом существующем проекте под названием rails-emoji.

Так неисправный выше пример будет установлен, выполнив:

string = ActiveSupport::JSON.decode('"\udbba\udf59"') 
> "" 
fixed = Emojivert.google_to_unified(string) 
> ""