至少在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:未定义的字符名称。
答案 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及更高版本允许您通过别名查找字符。