1.2.4. NFD¶
NFD 是 Unicode 规范中的一种标准化形式,叫做 Normalization Form Decomposition,即标准分解形式。它是一种将复杂字符分解为其基本组件的方式。
Unicode 标准化背景¶
在 Unicode 中,某些字符可以用多种方式表示,例如字母“é”既可以表示为一个单一字符 é(U+00E9),也可以分解为基础字符 e(U+0065)加上一个重音符号 ́(U+0301)。
NFD 的作用¶
NFD 会将字符分解为它们的基本形态。这意味着:
组合字符会被分解:例如,“é”会被分解为 e 和 ́。 不改变字符顺序:NFD 只会分解字符,不会对字符重新排列。
这对于自然语言处理中处理字符的一致性非常有帮助,因为不同的输入形式会被标准化为统一的表示。
适用场景¶
【总结】NFD 则适用于需要深入分析字符组成、灵活搜索匹配或在兼容性较差的环境中处理文本的情况。
字符分析:在需要对字符进行详细分析和处理的场合,使用NFD能够拆分字符,便于分析字符的基本组成部分。例如,在处理拼音、音调或其他附加符号时,NFD可以提供更精确的信息。
搜索和匹配:在执行文本搜索或匹配时,使用NFD可以提高匹配的灵活性,因为它允许用户在搜索时输入拆分字符的形式,而不是合成字符。
文本转换:在进行文本转换或格式化时,使用NFD能够确保文本在转换过程中保持其基础结构,便于其他处理。
支持老旧系统:某些老旧系统可能不支持合成字符,使用NFD可以确保文本的兼容性,使其能够在这些系统中正确显示。
示例¶
假设我们有字符 é 和 ê:NFD 会将 é 转换为 e + ́,将 ê 转换为 e + ̂,即基础字符加上组合符号。
示例-字符 “é”:
在NFD中,"é" 会被分解为基本字符 "e" (U+0065) 和重音符号 (U+0301)。
在NFC中,"é" 会被表示为单个预组合字符 U+00E9。
代码实现:
import unicodedata
# 示例字符串
s1 = 'café'
s2 = 'cafe\u0301' # 已经是NFD形式
# 使用NFD规范化
normalized_s1 = unicodedata.normalize('NFD', s1)
normalized_s2 = unicodedata.normalize('NFD', s2)
print(normalized_s1) # 输出: café
print(normalized_s2) # 输出: café
# 比较规范化后的字符串
print(normalized_s1 == normalized_s2) # 输出: True