String.prototype.normalize 用于将字符串转换为 Unicode 规范化形式以解决因编码差异导致的显示或比较不一致问题,支持 NFC(默认,合成)、NFD(分解)、NFKC/NFKD(兼容性映射)四种形式,常用于统一用户输入、关键词匹配、国际化文本处理及表情符号解析,但不处理繁简体、大小写等语言学逻辑。

String.prototype.normalize 用于将字符串转换为 Unicode 规范化形式,解决因不同编码方式导致的相同字符显示或比较不一致的问题,比如带重音符号的字母、汉字变体、组合字符等。
理解 Unicode 规范化形式
Unicode 定义了四种规范化形式:NFC、NFD、NFKC、NFKD。最常用的是 NFC(默认)和 NFD:
- NFC(Normalization Form C):合成形式,优先使用预组合字符(如 "é" 而不是 "e" + 重音符)
- NFD(Normalization Form D):分解形式,把预组合字符拆成基础字符加修饰符(如 "e" + "´")
- NFKC/NFKD 增加了兼容性映射(如全角数字转半角、连字展开),适合搜索或格式清理,但可能丢失语义信息
解决字符串比较不一致问题
用户输入或不同系统产生的同一含义字符串,可能底层码点不同,直接 === 会返回 false:
const a = "café"; // 预组合 é(U+00E9) const b = "cafe\u0301"; // e + U+0301(组合重音符) console.log(a === b); // false console.log(a.normalize() === b.normalize()); // true(默认 NFC)
建议在做用户名校验、关键词匹配、去重前统一 normalize:
- 用
.normalize("NFC")保证视觉一致的字符串码点也一致 - 若需分析或移除重音(如拼音搜索),可用
.normalize("NFD")后过滤组合字符
处理国际化文本中的常见场景
中文、日文、韩文虽大多无组合字符,但某些生僻字、异体字或带标注文本仍可能涉及规范化:
- 中日韩兼容汉字(如全角 ASCII、旧字形)在 NFKC 下会被映射为标准形式
- 表情符号序列(如 ??)依赖 Unicode 标准化才能正确识别和排序
- 剪贴板粘贴或 OCR 输出的文本常含混合规范化形式,normalize 可统一底层表示
注意事项与边界情况
normalize 不改变字符串语义,但不保证“完全等价”——它只按 Unicode 标准执行,不处理语言学逻辑:
- 不会自动转换繁简体(如「着」vs「著」)、大小写或拼音,这些需额外逻辑
- 部分组合字符在 NFD 下可能无法完美还原(如某些藏文或阿拉伯文连字)
- 性能开销极小,但高频调用(如每帧处理)可考虑缓存结果
- IE 不支持,需检查兼容性或引入 polyfill(如 string-normalize)


















