Разделение эмози, безопасно
Я пытаюсь разбить строку на отдельные слова/символы, но у меня возникают проблемы, когда дело доходит до emoji.
Прежде всего, я не могу просто разбить строку с использованием пустого символа, потому что emojis обычно имеют длину >= 2.
"😎".split("")
["�", "�"]
Я нашел emoji regex, который в основном работает, но теперь я вижу некоторые странные телесные блоки. Я даже вижу, что они появляются в твиттере в некоторых случаях.
![введите описание изображения здесь]()
Здесь ручка, которая иллюстрирует проблему с мясистыми блоками
http://codepen.io/positlabs/pen/QyEOEG?editors=011
![введите описание изображения здесь]()
ОБНОВЛЕНИЕ -----------
Попробуйте spliddit, и я все еще вижу проблему с персонажами тона кожи. Есть ли способ склеить их вместе?
http://codepen.io/positlabs/pen/rxLqwL?editors=001
Ответы
Ответ 1
Строки JavaScript - это UTF-16, поэтому ваш emoji внутренне представлен как два блока кода:
> "\ud83d\ude0e" === "😎"
true
Функция String.prototype.split
действительно не заботится о суррогатных парах в UTF-16, поэтому она наивно меняет отдельные единицы кода и разбивает ваши эможи, потому что JavaScript не предоставляет никакого способа обработки отдельных символов в строках.
Там нет простого способа справиться с этим. Для правильной обработки отдельных блоков кода вам нужна библиотека, например spliddit.
Я не на 100% знаком с терминологией, поэтому, пожалуйста, отредактируйте мой ответ по мере необходимости.
Ответ 2
spliddit в настоящее время не может правильно разделить, например, этот текст хинди на его 5 символов: "अनुच्छेद"
Вам нужна библиотека разделителей графем:
https://github.com/orling/grapheme-splitter
Это полная реализация стандарта Unicode UAX-29 и разделит даже самые экзотические буквы, а эможи - всего лишь один из многих случаев использования.