为什么unicodedata不识别某些字符?

时间:2014-07-03 11:42:30

标签: python unicode

至少在Python 2中,unicodedata.name()无法识别某些字符。

ActivePython 2.7.0.2 (ActiveState Software Inc.) based on
Python 2.7 (r27:82500, Aug 23 2010, 17:17:51) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> from unicodedata import name
>>> print(u'\n')


>>> name(u'\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: no such name
>>> name(u'a')
'LATIN SMALL LETTER A'
>>>

(第一个print是为了证明Python本身将u'\n'识别为换行符。)

当然是Unicode contains字符\n,它有一个名称,特别是“LINE FEED”。

NB。 unicodedata.lookup('LINE FEED')unicodedata.lookup(u'LINE FEED')都提供了KeyError:未定义的字符名称。

1 个答案:

答案 0 :(得分:9)

unicodedata.name()查找依赖于UnicodeData.txt database in the standard的第2列(Python 2.7使用Unicode 5.2.0)。

如果该名称以<开头,则会被忽略。所有控制代码,包括换行符,都属于该类别;第一列除<control>以外的无名称

000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;

第10列是,Unicode 1.0名称,根据标准不应使用。换句话说,\n 没有名称,而不是Python数据库忽略的通用<control>(因为它不是唯一的)。

Python 3.3添加了对NameAliases.txt的支持,可让您按别名查找名称;所以lookup('LINE FEED')lookup('new line')lookup('eol')等都引用\n。但是,unicodedata.name()方法不支持别名,也不支持它(它会选择哪个?):

  
      
  • 添加了对Unicode名称别名和命名序列的支持。 unicodedata.lookup()'\N{...}'现在都解析了名称别名,unicodedata.lookup()也解析了命名序列。
  •   

TL; DR:LINE FEED不是\n的正式名称,它只是它的别名。 Python 3.3及更高版本允许您通过别名查找字符。