Разделение эмози, безопасно

Я пытаюсь разбить строку на отдельные слова/символы, но у меня возникают проблемы, когда дело доходит до 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 и разделит даже самые экзотические буквы, а эможи - всего лишь один из многих случаев использования.