不使用 ES6 或 ES5 的 Unicode Aware String.split('')

Unicode Aware String.split('') without using ES6 or ES5

var emoji = '';

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

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

迭代器/ES6 是不允许的,Array.from、正则表达式 /u 标志、[...spread] 语法等也是如此

也欢迎任何相关链接。

这两个示例都适用于 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);

假设输入字符串是 well-formed(不包含开头的破字符),假设代理项对的范围从 D800 到 DBFF(十六进制),每个 unicode.org,所有你需要做的是检查字符是否在该范围内,以决定是捕获一个字符还是两个字符:

var emoji = 'foo  IU bar ';
var matches = emoji.match(/[^\uD800-\uDBFF]|[\s\S]{2}/g);
console.log(matches);

如果您也想验证尾随代理项,请将尾随字符匹配为十六进制的 DC00 到 DFFF。