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

Ham*_*ite 13 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'
>>>
Run Code Online (Sandbox Code Playgroud)

(第一个print是证明Python本身可以识别u'\n'为换行符.)

当然Unicode 包含字符\n,它有一个名称,特别是"LINE FEED".

NB.unicodedata.lookup('LINE FEED')并且unicodedata.lookup(u'LINE FEED')都给出了KeyError:未定义的字符名称.

Mar*_*ers 9

所述unicodedata.name()查找依赖于第2列中的标准UnicodeData.txt数据库(Python 2.7版使用Unicode 5.2.0).

如果该名称以<它开头,则忽略它.所有控制代码,包括换行符,都属于该类别; 第一列没有其他名称<control>:

000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;
Run Code Online (Sandbox Code Playgroud)

第10列是旧的 Unicode 1.0名称,根据标准不应使用.换句话说,\n 没有名字,比一般的其他<control>,这Python的数据库忽略(因为它不是唯一的).

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及更高版本允许您按别名查找字符.

  • @Mazyod:我误解了您的错误消息的含义,我以为您的意思是模块上的函数“name()”出现属性错误。您遇到了不同的问题:Python 3.8 和 Python 3.9 分别捆绑了不同的 Unicode 标准 12.1.0 和 13.0.0。请参阅 [`unicodedata.unidata_version` 属性](https://docs.python.org/3/library/unicodedata.html#unicodedata.unidata_version)。“含泪笑脸”是 [Unicode 13 中的新功能](https://unicode.org/emoji/charts-13.0/emoji-released.html)。 (4认同)