Unicode字符名称列表

12

在Python中,我可以通过名称打印一个Unicode字符(例如:print(u'\N{snowman}'))。有没有一种方法可以获取所有有效名称的列表?


7
那将涵盖整个Unicode标准。 - Martijn Pieters
1
你为什么问这个问题? - Mike Graham
@MikeGraham 想和我的学生们玩一个小游戏。 - Miki Tebeka
请注意,如果他们使用的是不同版本的Python,则游戏可能会适得其反:请参见Martijn Pieters下面的答案 - Jongware
7个回答

23
每个代码点都有一个名称,所以您实际上是在请求Unicode标准代码点名称列表(以及由Python 3.3及更高版本支持的*名称别名列表)。
每个Python版本都支持特定版本的Unicode标准;unicodedata.unidata_version属性告诉您给定Python运行时使用的版本。上述链接指向最新发布的Unicode版本,请将URL中的UCD/latest替换为您的Python版本的unicodedata.unidata_version的值。
按照编码点, unicodedata.name()函数 可以告诉您正式名称,而 unicodedata.lookup() 则可逆(名称到编码点)。

函数 namelookup 真的是互逆的吗?确实,name(lookup('space')) 返回 SPACE。但是 lookup('escape') 返回预期值,而 name(lookup('escape')) 引发 ValueError: no such name - Jeyekomon
1
@Jeyekomon 并非所有的 Unicode 代码点都有名称;escape 是一个别名。lookup() 接受名称、别名(和序列),但 name() 只返回官方名称。大多数控制字符(如 escape)没有名称。请注意,space 是一个别名,名称始终是大写的。维基百科有一个很好的概述,说明哪些字符没有名称。 - Martijn Pieters

5
如果您想要一个包含所有Unicode字符名称的列表,请考虑下载Unicode Character Database
它包含在许多Linux发行版的基础软件库中(例如RHEL上的“unicode-ucd”)。
该软件包包括NamesList.txt,其中包含详尽的Unicode字符名称列表。
注意:NamesList.txt需要一些时间才能下载(大小> 1.5 MB)。
示例:
21FE    RIGHTWARDS OPEN-HEADED ARROW
21FF    LEFT RIGHT OPEN-HEADED ARROW
@@  2200    Mathematical Operators  22FF
@@+
@       Miscellaneous mathematical symbols
2200    FOR ALL
    = universal quantifier
2201    COMPLEMENT
    x (latin letter stretched c - 0297)
2202    PARTIAL DIFFERENTIAL
2203    THERE EXISTS
    = existential quantifier
2204    THERE DOES NOT EXIST
    : 2203 0338
2205    EMPTY SET
    = null set
    * used in linguistics to indicate a null morpheme or phonological "zero"
    x (latin capital letter o with stroke - 00D8)
    x (diameter sign - 2300)
    ~ 2205 FE00 zero with long diagonal stroke overlay form

2

是的,有一种方法。 遍历所有现有的代码点,并在每个代码点上调用 unicodedata.name()。 就像这样:

names = []
for c in range(0, 0x10FFFF + 1):
    try:
        names.append(unicodedata.name(c))
    except KeyError:
        pass
# Do something with names

至少在Python 3中,应该使用except ValueError而不是except KeyError。https://docs.python.org/3/library/unicodedata.html#unicodedata.name - Dominique Unruh

1
对于给定的代码点,您可以使用unicodedata.name。要获取所有这些名称,您可以处理所有数十亿个字符以查看哪些具有此类名称。

3
不是数十亿,标准还没有那么大。不过Unicode 7.0包含了112,804个字符。 - Martijn Pieters
2
没有数十亿个名称,但有数十亿个潜在的代码点需要逐一检查,如果我们天真地遍历它们。 - Mike Graham
8
代码点数量恒定为1,114,112,您必须非常天真才能遍历整个32位空间。 - 一二三

1
只需打印它们全部:
import unicodedata 

for i in range(0x110000): 
    character = chr(i) 
    name = unicodedata.name(character, "") 
    if len(name) > 0: 
        print(f"{i:6} | 0x{i:04X} | {character} | {name}") 

0

这是我的一行代码,只是为了自己的参考;p

import unicodedata
names = [unicodedata.name(chr(c)) for c in range(0, 0x10FFFF+1) if unicodedata.name(chr(c), None)]

0

如果您想按名称插入Unicode字符,但不知道其名称,以下是如何轻松查看Unicode字符名称的方法。

在Windows上

  1. 打开“字符映射器”(搜索charmap.exe并运行它)。
  2. 选择任何常见的Microsoft字体(这些字体通常定义了各种Unicode字符)。
  3. 单击地图上的任何字符以获取其Unicode字符名称。

在Mac上,它称为“字符调色板”,可以在“系统偏好设置”,“国际化->输入”或“语言和文本->输入源”下通过选中“字符调色板”旁边的框来找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接