Unicodedata.normalize()ValueError:无效的规范化形式

时间:2016-03-31 08:17:43

标签: python python-3.x unicode

我正在尝试使用外语文本并输出一个人类可读的,文件名安全的等价物。环顾四周之后,似乎最好的选择是unicodedata.normalize(),但我无法让它发挥作用。我已尝试在这里和其他地方提供一些答案的确切代码,但它一直给我这个错误。我跑的时候只取得了一次成功:

unicodedata.normalize('NFD', '\u00C7')
'C\u0327'

但是每隔一段时间,我都会收到一个错误。这是我尝试过的代码:

unicodedata.normalize('NFKD', u'\u2460') #error, not sure why. Look same as above.
s = 'ذهب الرجل'
unicodedata.normalize('NKFC',s) #error
unicodedata.normalize('NKFD', 'ñ') #error

具体来说,我得到的错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid normalization form

我不明白为什么这不起作用。所有这些都是字符串,这意味着它们在Python 3中是unicode。我尝试使用.encode()对它们进行编码,但后来normalize()表示它只接受字符串的参数,所以我知道它不可能是。我真的很茫然,因为即使我从这里复制的代码似乎也出错了。这是怎么回事?

1 个答案:

答案 0 :(得分:4)

查看unicodedata.c,唯一可以获得该错误的方法是输入无效的表单字符串。有效值是&#34; NFC&#34;,&#34; NFKC&#34;,&#34; NFD&#34;和&#34; NFKD&#34;,但您似乎正在使用值&#34; F&#34;和&#34; K&#34;转过来:

>>> import unicodedata
>>>
>>> unicodedata.normalize('NKFD', 'ñ')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid normalization form
>>>
>>> unicodedata.normalize('NFKD', 'ñ')
'ñ'