Я пытаюсь проанализировать входящую строку, чтобы определить, содержит ли она какие-либо не смайлы.
Я прочитал эту замечательную статью Матиаса и использую как собственные punycode
для кодирования / декодирование и regenerate
для генерации регулярного выражения. Я также использую EmojiData, чтобы получить свой словарь смайлов.
С учетом всего сказанного, некоторые смайлики продолжают быть надоедливыми маленькими жукерами и отказываются соответствовать. За определенные эмодзи я продолжаю получать пару кодовых баллов.
// Example of a single code point:
console.log(punycode.ucs2.decode('????'));
>> [ 128169 ]
// Example of a paired code point:
console.log(punycode.ucs2.decode('⌛️'));
>> [ 8987, 65039 ]
Матиас затрагивает это в своей статье (и приводит пример использования punycode, работающего с этим), но даже используя его пример, я получаю неверный ответ:
function countSymbols(string) {
return punycode.ucs2.decode(string).length;
}
console.log(countSymbols('????'));
>> 1
console.log(countSymbols('⌛️'));
>> 2
Как лучше всего определить, содержит ли строка все смайлы или нет? Это сделано для проверки концепции, поэтому решение может быть настолько грубым, насколько это необходимо.
--- ОБНОВИТЬ ---
Еще немного контекста о моих надоедливых смайликах выше.
Они визуально идентичны, но на самом деле разные значения Unicode (второе из приведенного выше примера):
⌛ // \u231b
⌛️ // \u231b\ufe0f
Первый отлично работает, второй - нет. К сожалению, похоже, что iOS использует вторую версию (если вы скопируете и вставите из iMessage, вы получите вторую версию, и при получении текста от Twilio то же самое).