Why does unicodedata.name() raise "ValueError: no such name" for some ASCII characters?

Why does unicodedata.name() raise "ValueError: no such name" for some ASCII characters?

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 字符(\x00\x1F\x7F),我遇到了同样的错误。 unicodedata.name() 仅适用于可打印字符吗?如果是这样,Python 文档中在哪里提到它?

根据此 Wikipedia articleCc 控制字符在 Unicode 中没有名称。您提到的所有字符都归类在 Cc 类别下(您可以使用 unicodedata.category API 确认这一点)

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

In Unicode, "Control-characters" are U+0000—U+001F (C0 controls), U+007F (delete), and U+0080—U+009F (C1 controls). Their General Category is "Cc". Formatting codes are distinct, in General Category "Cf". The Cc control characters have no Name in Unicode, but are given labels such as "<control-001A>" instead.

您还可以看到CONTROL CHARACTERs are explicitly handled in cpython source code

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

如您所见,所有不可打印的 ASCII 控制字符都被命名为“<control>”:“NULL”不是 0000 的名称,它是一个别名。

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