unicodedata.normalize方法的不同行为

时间:2018-11-04 17:24:46

标签: python unicode-normalization

以下代码摘自This SO Post。

def unicodeToAscii(s):
    return ''.join(
        c for c in unicodedata.normalize('NFD', s)
        if unicodedata.category(c) != 'Mn'
        and c in all_letters
    )

当我运行这个

print(unicodeToAscii('Ślusàrski'))

我得到以下输出

Slusarski

但是,当我刚运行unicodedata.normalize('NFD','Ślusàrski')时,会得到与输出相同的旧字符串Ślusàrski

如果类别Mn及其在all_letters中,则该函数中的代码只是做相同的操作,并忽略所有不是的字符。为什么为什么我的normalize方法调用不一样?

1 个答案:

答案 0 :(得分:1)

unicodedata.normalize('NFD','Ślusàrski')的输出可能与输入字符串外观相同,但事实并非如此。如果我们使用ascii()强制使用\uXXXX转义符显示所有非ASCII字符,则得到:

>>> print(ascii(unicodedata.normalize('NFD','Ślusàrski')))
'S\u0301lusa\u0300rski'

在这里,我们看到NFD的效果:每个重音字符都被分解为一个非重音字符加上一个重音字符(类别为Mn)。这就是为什么您的第一个代码段的其余部分产生Slusarski的原因:它不在Ś上运行,而是在S + ´上运行。