如何对包含高码点字符的字符串进行分块?
问题原因与解决方案
问题根源
你的问题核心在于JavaScript字符串的编码特性和正则表达式的默认行为:
- 码点
1114111(0x10FFFF)是Unicode补充平面字符,在JS中会被编码为两个UTF-16代理对单元(0xD83F和0xDFFF),因此这个字符在字符串中占2个UTF-16编码位置。 - 正则表达式默认的
.元字符仅匹配单个UTF-16单元,而非完整的Unicode码点。因此/.{2}/g会将3(1个UTF-16单元)与代理对的第一个单元组合成一组,代理对的第二个单元与9组合成另一组,最终得到错误的['3�', '�9']。
解决方案
给正则添加u修饰符,开启Unicode模式,此时.会匹配完整的Unicode码点(无论其占用多少个UTF-16单元)。修改后的代码如下:
"397".match(/.{2}/gu)
执行后将得到期望结果:['3', '97']。
如果需要处理字符总数为奇数的场景,可以将正则调整为/.{1,2}/gu,这样最后一组会包含剩余的单个字符。
内容的提问来源于stack exchange,提问作者mbourd
相关产品推荐
相关产品推荐

