【问题标题】:Why does unicodedata.name() raise "ValueError: no such name" for some ASCII characters?为什么 unicodedata.name() 会为某些 ASCII 字符引发“ValueError: no such name”?
【发布时间】:2022-01-01 13:53:35
【问题描述】:

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 文档中哪里提到过?

【问题讨论】:

    标签: python unicode


    【解决方案1】:

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

    >>> 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 中没有名称,但已给出 标签,例如"&lt;control-001A&gt;"

    你还可以看到CONTROL CHARACTERs arecpython source code中显式处理

    【讨论】:

      【解决方案2】:

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

      如您所见,所有不可打印的 ASCII 控制字符都被命名为“&lt;control&gt;”:“NULL”不是 0000 的名称,而是别名。

      现在,为什么 Python 不显示“&lt;control&gt;”是另一个我无法回答的问题。

      【讨论】:

      • 我认为是因为 '' 不是唯一的,因此可能会导致其他问题。
      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2016-06-21
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多