JavaScript charCodeAt相关问题:0xd7ff、0xe000及码点计算逻辑解析
代码逻辑与常量含义解析
两个边界常量的作用
0xd7ff和0xe000是UTF-16编码体系里代理区间的上下边界:
- Unicode为了兼容UTF-16编码规则,在基本多语言平面(BMP,码点范围
0x0000`0xFFFF`)中预留了`0xD800`0xDFFF共2048个码位,专门用于表示超出BMP范围的补充平面字符(也就是需要两个16位码元存储的字符,比如部分emoji、生僻汉字),这个区间不会分配给任何独立的有效字符。 0xd7ff是代理区间之前最后一个有效BMP字符的码点值,0xe000是代理区间之后第一个有效BMP字符的码点值。
代码中if (code <= 0xd7ff || code >= 0xe000) return code的判断逻辑,就是识别当前位置取到的码元是不是独立的单码元字符,如果是就直接返回对应码点,不需要做拼接计算。
代理对计算公式的作用
(code << 10) + next - 0x35fdc00是手动计算UTF-16代理对对应真实Unicode码点的简化实现,用来给不支持原生codePointAt方法的老旧JS环境做兼容:
- 如果当前位置的码元落在代理区间内,说明它是代理对的前导(高)代理码元,需要和下一个位置的尾随(低)代理码元组合,才能得到字符的真实码点。
- UTF-16代理对转码点的标准换算规则为:
真实码点 = (高代理码元 - 0xD800) * 1024 + (低代理码元 - 0xDC00) + 0x10000
- 把标准公式展开后合并所有常数项计算:
-0xD800 * 1024 - 0xDC00 + 0x10000的结果正好是-0x35fdc00,而左移10位等价于乘以1024,因此公式可以简化为代码中的写法,计算结果和标准规则完全一致。
补充说明:开头定义的nonASCIIwhitespace正则,用于匹配ASCII空白字符(空格、制表符、换行符等)之外的特殊空白字符,包括排版用窄空格、全角空格、零宽格式符、字节顺序标记等。
内容的提问来源于stack exchange,提问作者cui
相关产品推荐
相关产品推荐

