无需登录 数据私有 本地保存

Unicode 正规化测试器 - NFC/NFD/NFKC/NFKD 对比

7
0
0
0

Unicode 正规化测试器

对比 NFC / NFD / NFKC / NFKD 四种正规化形式,查看字符级码点变化,理解 Unicode 文本标准化过程。

字符数: 0 | UTF-8字节: 0
原始码点:
NFC 规范组合 (Canonical Composition)
与输入相同 0 字符
NFD 规范分解 (Canonical Decomposition)
与输入相同 0 字符
NFKC 兼容组合 (Compatibility Composition)
与输入相同 0 字符
NFKD 兼容分解 (Compatibility Decomposition)
与输入相同 0 字符
差异摘要
输入文本后自动分析四种正规化形式之间的差异…
常见问题与知识点

Unicode 正规化是将文本转换为统一标准形式的过程。同一个"字符"在 Unicode 中可能有多种编码方式。例如,é 可以编码为单个字符 U+00E9(NFC),也可以编码为 e + 组合重音符 U+0065 U+0301(NFD)。正规化确保文本比较、搜索、存储时的一致性,是 W3C 推荐的最佳实践。

NFC(规范组合):先将字符分解,再将可组合的字符序列合并为单个预组合字符。生成的文本更紧凑,是 Web 内容、HTML 页面和大多数文件系统的推荐形式。
NFD(规范分解):将字符分解为基础字符 + 组合标记的形式。适用于文本处理、排序算法和需要逐字符分析的场景。
例如:é 在 NFC 中为 1 个码点 U+00E9,在 NFD 中为 2 个码点 U+0065 U+0301

"K" 代表 Compatibility(兼容性)。NFKC 和 NFKD 在规范分解的基础上,还会将"兼容性字符"转换为它们的等价形式。这包括:
• 连字: (U+FB03) → ffi
• 圈数字: (U+2460) → 1
• 商标符号: (U+2122) → TM
• 上标/下标:² (U+00B2) → 2
• 半角片假名:ガ
注意:兼容性分解会丢失格式信息,不可逆。适用于搜索引擎、密码比对等需要忽略格式差异的场景。

W3C 推荐在 Web 上使用 NFC 作为默认的正规化形式。具体建议:
• HTML 页面内容:使用 NFC
• 表单输入存储前:使用 NFC 正规化
• 密码/敏感数据比对:使用 NFKC 以忽略格式差异
• 搜索引擎索引:使用 NFKC 提高匹配率
• 文本编辑器内部处理:可使用 NFD 便于逐字符操作
在 JavaScript 中,使用 str.normalize('NFC') 即可进行正规化。

NFC ↔ NFD 之间的转换是可逆的(规范等价),因为它们仅涉及规范分解与组合,不丢失信息。
NFKC/NFKD 的兼容性转换是不可逆的。例如 转为 1 后,无法再恢复为圈数字形式。兼容性字符(如连字、圈数字、数学字体字符等)被永久替换为普通字符。因此仅在明确需要忽略格式差异时使用 NFKC/NFKD。

直接比较两个 Unicode 字符串可能因编码方式不同而得出错误结果。推荐做法:
str1.normalize('NFC') === str2.normalize('NFC')
如果需要忽略兼容性格式差异(如连字、圈数字等),使用:
str1.normalize('NFKC') === str2.normalize('NFKC')
这在实现搜索功能、用户输入验证、密码比对等场景中非常重要。