以下代码摘自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方法调用不一样?
答案 0 :(得分:1)
unicodedata.normalize('NFD','Ślusàrski')
的输出可能与输入字符串外观相同,但事实并非如此。如果我们使用ascii()
强制使用\uXXXX
转义符显示所有非ASCII字符,则得到:
>>> print(ascii(unicodedata.normalize('NFD','Ślusàrski')))
'S\u0301lusa\u0300rski'
在这里,我们看到NFD的效果:每个重音字符都被分解为一个非重音字符加上一个重音字符(类别为Mn)。这就是为什么您的第一个代码段的其余部分产生Slusarski
的原因:它不在Ś
上运行,而是在S
+ ´
上运行。