我正在测试函数isprintable()
。我想打印字符串string.whitespace + unicodedata.lookup("GREEK SMALL LETTER ALPHA")
中所有字符的Unicode名称。
如何打印所有名称,例如"空格"、"无空格"、水平制表符、"希腊字母小写字母字母字母"。
import unicodedata, string
for e in string.whitespace + unicodedata.lookup("GREEK SMALL LETTER ALPHA"):
print(ord(e))
print(unicodedata.name(e))
我得到错误"ValueError:没有这样的名称">
32
SPACE
9
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
ValueError: no such name
正如注释所示,Unicode数据库没有每个字符的名称,但NameAliases.txt
有。下面解析该文件并返回一个别名(如果存在(。在这种情况下,在文件中找到的第一个:
import string
import requests
import unicodedata as ud
# Pull the official NameAliases.txt from the matching Unicode database
# the current Python was built with.
response = requests.get(f'http://www.unicode.org/Public/{ud.unidata_version}/ucd/NameAliases.txt')
# Parse NameAliases.txt, storing the first instance of a code and a name
aliases = {}
for line in response.text.splitlines():
if not line.strip() or line.startswith('#'):
continue
code,name,_ = line.split(';')
val = chr(int(code,16))
if val not in aliases:
aliases[val] = name
# Return the first alias from NameAliases.txt if it exists when unicodedata.name() fails.
def name(c):
try:
return ud.name(c)
except ValueError:
return aliases.get(c,'<no name>')
for e in string.whitespace + ud.lookup("GREEK SMALL LETTER ALPHA"):
print(f'U+{ord(e):04X} {name(e)}')
输出:
U+0020 SPACE
U+0009 CHARACTER TABULATION
U+000A LINE FEED
U+000D CARRIAGE RETURN
U+000B LINE TABULATION
U+000C FORM FEED
U+03B1 GREEK SMALL LETTER ALPHA
如本问答中所述;在注释中由wjandrea链接,ASCII控制字符在当前Unicode标准中没有正式名称,因此在查找它们时会得到ValueError。
标准库中的CCD_;名称";对于这些字符,对应于ASCII表中Char列中列出的名称(如man ascii
所示(,但没有说明。
所以我们可以做这个
import string
import unicodedata
from curses.ascii import controlnames
for e in (string.whitespace + "N{GREEK SMALL LETTER ALPHA}"):
try:
name = unicodedata.name(e)
except ValueError:
name = controlnames[ord(e)]
print(name)
给出这个结果
SPACE
HT
LF
CR
VT
FF
GREEK SMALL LETTER ALPHA
这并不理想,但可能是在不使用外部资源的情况下可以做的最好的事情,正如这个优秀的答案所做的那样。