Строка с поддержкой Unicode.split(«) без использования ES6 или ES5

#javascript #unicode

#javascript #юникод

Вопрос:

 var emoji = '😋';

var s = emoji.split(''); // ["�", "�"]  String.split('') destroys surrogate pairs.

var s = emoji.splitUnicodeAware(''); // ['😋']
  

Итераторы / ES6 не разрешены, как Array.from /u и флаг регулярных [...spread] выражений, синтаксис и т.д.

Также приветствуются любые соответствующие ссылки.

Комментарии:

1. Что вы пробовали до сих пор, чтобы решить это самостоятельно?

2. И почему глупые ограничения?

3. Array.from это ES6, а не ES5. Вы действительно не можете использовать ES5 с 2009 года?

4. Упс. Мой плохой.

Ответ №1:

Предполагая, что входная строка правильно сформирована (не содержит битых символов для начала), учитывая, что суррогатные пары варьируются от D800 до DBFF (в шестнадцатеричном формате), за unicode.org все, что вам нужно сделать, это проверить, находится ли символ в пределах этого диапазона, чтобы решить, следует ли захватывать один символ или два.:

 var emoji = 'foo 😋 I💖U bar 𝟘𝟙𝟚𝟛';
var matches = emoji.match(/[^uD800-uDBFF]|[sS]{2}/g);
console.log(matches);  

Если вы хотите также проверить конечные суррогаты, сопоставьте конечный символ как DC00 с DFFF в шестнадцатеричном формате.

Ответ №2:

Оба этих примера работают с Firefox 27 (2014) или выше. Я бы сказал, что это достаточно переносимо:

 const s = '📗📒📙📕';

// example 1
let a1 = [];
for (let s1 of s) {
   a1.push(s1);
}

// example 2
let a2 = [...s];

// print
console.log(a1, a2);
  

Комментарии:

1. К сожалению, для этого требуется использование итератора массива