normalize()是es6新增字符串方法,用于解决unicode同形不同码问题,通过nfc(默认)、nfd、nfkc、nfkd四种规范化形式统一字符表示,确保比较、搜索、去重等操作准确。

normalize() 是 ES6 为字符串实例新增的方法,专门用来解决 Unicode 字符“同形不同码”的问题——比如带重音的字母Ǒ,既可写成单个预组合字符 \u01D1,也可写成基础字符 O(\u004F)加组合符号 ˇ(\u030C)拼成 \u004F\u030C。虽然视觉和语义完全一样,但 JavaScript 原生认为它们不相等、长度也不同。
为什么需要 normalize()
因为 JavaScript 按 UTF-16 编码单元计数,不自动识别组合关系:'\u01D1' === '\u004F\u030C' → false'\u01D1'.length → 1,而 '\u004F\u030C'.length → 2
这会导致字符串比较、搜索、去重等操作出错。normalize() 就是让这两种写法“变成同一种样子”,再做后续处理。
四种规范化形式的区别与选用
normalize 接受一个可选参数,指定规范化策略,常用的是以下四种:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
NFC(默认):标准等价合成。把能合并的字符尽量合成为预组合形式,适合常规显示和存储。
例:'\u004F\u030C'.normalize('NFC')→'Ǒ'(长度变为 1) -
NFD:标准等价分解。把预组合字符拆成基础字符 + 组合标记,适合文本分析、排序或输入法处理。
例:'Ǒ'.normalize('NFD')→'O\u030C'(长度变为 2) -
NFKC / NFKD:兼容等价(含格式转换)。会进一步处理全角/半角、上标/普通数字、连字(如 ffi)等“看起来像、语义近似但不严格等价”的情况。
例:'½'.normalize('NFKC')→'1/2';'0'.normalize('NFKC')→'0'
实际使用建议
多数场景推荐直接用默认的 .normalize()(即 NFC),它最安全、兼容性好:
- 用户输入含重音名(如 “José”)、德语变音(如 “Müller”)时,统一 NFC 后再比对或存库,避免漏匹配
- 做前端表单校验,比如邮箱、用户名去重,先
str.normalize()再===或Set.add() - 配合
includes()、startsWith()使用,确保组合字符也能被正确识别
例:'O\u030C'.normalize().includes('Ǒ')→ true
注意事项
normalize 不改变原始字符串(字符串不可变),只返回新字符串;它对中文、日文、韩文等汉字基本无影响(Unicode 中汉字极少用组合形式);不支持浏览器低于 IE11(但现代项目基本无需考虑)。










