第一种方案:使用空字符串当做分隔符.
'Dragon ? '.split('')
(10) ["D", "r", "a", "g", "o", "n", " ", "�", "�", " "]
结果:失败,Emoji 无法正常切割
第二种方案:使用正则表达式切割
'Dragon ? '.split(/|/)
(10) ["D", "r", "a", "g", "o", "n", " ", "�", "�", " "]
结果:失败,Emoji 无法正常切割
第三种方案:使用 unicode 模式的正则表达式切割
'Dragon ? '.split(/|/u)
(9) ["D", "r", "a", "g", "o", "n", " ", "?", " "]
结果:成功,可以切割 Emoji
第四种方案:使用 ES 的语法
[...'Dragon ? ']
(9) ["D", "r", "a", "g", "o", "n", " ", "?", " "]
结果:成功,可以切割 Emoji
下面,我们测试一种更加复杂的场景:国旗。
" ?? ??".split(/|/u)
(7) [" ", "?", "?", " ", "?", "?", ""]
[..." ?? ??"]
(7) [" ", "?", "?", " ", "?", "?", ""]
很明显,两种切割方式的结果可能会不符合读者的直觉。
但是,这种分割结果是符合要求的。
实际上,根据 Unicode 的标准,国旗是通过多个字符组合而成。
比如,中国 ?? 是由"?" 和 "?" 组合而成。
["?", "?", "?"].join('')
"???"
["?", "?", "?"].join('')
"???"
3个字符调整顺序后再拼接,会展现出两种不同的国旗。对于程序员,如果遇到字符串切割、多行文本渲染、字符串逆序等需求时,一定要根据实际情况采用合适方案处理。