编码与安全指南
Unicode 转义:码点、UTF-16 与代理对
解释 emoji 为什么占两个 JavaScript 字符串单元,按目标格式选择转义写法。
区分字符与存储单元
Unicode 码点未必只占一个 UTF-16 单元,JavaScript 字符串使用 UTF-16,因此一个 emoji 的 length 可以是二。
用户感知字符也可能由多个码点组成,如组合标记和 emoji 序列,不能把 string.length 当作通用字符数。
"😀".length → 2
[..."😀"].length → 1JSON 使用四位转义
JSON 支持反斜杠 u 后四个十六进制数字,补充平面码点通过高、低代理对表示。
JavaScript 在相应上下文也支持花括号码点转义,但该写法不是合法 JSON 字符串转义。
JSON: "\ud83d\ude00"
JavaScript: "\u{1F600}"检查转义层数
字面的反斜杠 u 序列与解析后的字符不同,JSON 字符串中再包装 JSON 会增加一层。
应只解析约定层数,全局删反斜杠会破坏路径、正则和带引号的字符串内容。
检查完整文本
单独代理项不是完整补充平面字符,不同接收端处理方式可能不同,需要验证目标解析器。
用基本字符、emoji、组合序列做往返,协议签署或哈希原始 UTF-8 时还应单独比较字节。