2016-04-22 2 views
6

Обычно я бы просто использовал что-то вроде str[i].Как перебирать только символы в строке, которую я действительно вижу?

А что, если str = "☀️"?

str[i] не работает. for (x of str) console.log(x) также не работает. Он печатает в общей сложности 4 символа, хотя в строке есть только 2 эможи.

Каков наилучший способ перебора каждого символа, который я могу видеть в строке (и, возможно, новой строки), и ничего больше?

Идеальное решение будет возвращать массив из 2 символов: 2 emoji и ничего больше. Заявленный дубликат и множество других решений, которые я нашел, не соответствуют этим критериям.

+2

Я думаю, что вы должны проверить этот блог: [ссылка] (https://mathiasbynens.be/ notes/javascript-unicode) – msencer

+2

Возможный дубликат [Разделить строку JavaScript в массив кодовых точек? (с учетом «суррогатных пар», но не «графемных кластеров»)] (http://stackoverflow.com/questions/21397316/split-javascript-string-into-array-of-codepoints-taking-into-account-surrogat) –

+0

Вы говорите, что хотите захватить эмози или пропустить его и найти следующий «нормальный» персонаж? – KevBot

ответ

0

Вам нужно сделать свои собственные методы для астральных персонажей.

"foobar".match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|./g); 
// => ["f", "o", "o", "", "b", "a", "r"] 
+0

Это не работает во всех случаях. Рассмотрим «foob☀️ar» .match (/ [\ uD800- \ uDBFF] [\ uDC00- \ uDFFF] | ./g); '. – thedayturns

+0

@thedayturns: Да, я только покрыл астральные персонажи, где JavaScript «ошибочно» разбивает один символ Unicode на два символа JS.В пустой строке есть VARIATION SELECTOR 16 (U + FE0F), который является отдельным символом Юникода, но сочетается с предыдущим; аналогичной проблемой будут все сочетания символов, таких как КОМБИНИРОВАНИЕ ОСТРАЯ АКЦЕНТ (U + 0301). Поэтому для решения этой проблемы вам понадобится целая библиотека, которая выходит за рамки ответа StackOverflow. – Amadan

Смежные вопросы