为什么 unicodedata.name() 会提高某些 ASCII 字符的"ValueError: no such name"?



unicodedata.name('x00')引发ValueError异常:

Python 3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information
>>> import unicodedata
>>> unicodedata.name('x00')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: no such name

x00是 NUL 字符。为什么unicodedata.name('x00')会引发异常?对于其他不可打印的 ASCII 字符(x00x1Fx7F),我遇到了同样的错误。unicodedata.name()仅适用于可打印字符吗?如果是这样,Python 文档中在哪里提到它?

根据这篇维基百科文章,Cc控制字符在 Unicode 中没有名称。您提到的所有字符都归类Cc类别(您可以使用unicodedata.categoryAPI进行确认)

>>> import unicodedata
>>> unicodedata.category('x00')
'Cc'
>>> unicodedata.category('x1F')
'Cc'
>>> unicodedata.category('x7F')
'Cc'

在 Unicode 中,"控制字符"是 U+0000—U+001F(C0 控制), U+007F(删除)和 U+0080—U+009F(C1 控制)。他们的将军 类别为"抄送"。格式代码在"常规"类别中是不同的 "呵呵"。Cc控制字符在 Unicod e 中没有名称,但被赋予 标签,例如"<control-001A>"

您还可以看到CONTROL 字符在 cpython 源代码中显式处理

如果你看一下 unicode 字符的名称是什么意思,它指的是这个列表:https://www.unicode.org/Public/13.0.0/ucd/NamesList.txt

如您所读,所有不可打印的 ASCII 控制字符都命名为"<control>":"NULL"不是 0000 的名称,而是别名。

现在,为什么Python不显示"<control>"是另一个我无法回答的问题。

相关内容

最新更新