在Python中打印所有Unicode字符

3
我已经编写了一些代码来创建十六进制系统的所有四位组合,现在我正在尝试使用它来打印与这些值相关联的所有unicode字符。以下是我用于执行此操作的代码:
char_list =["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]
pairs = []
all_chars = []

# Construct pairs list
for char1 in char_list:
    for char2 in char_list:
        pairs.append(char1 + char2)

# Create every combination of unicode characters ever
    for pair1 in pairs:
        for pair2 in pairs:
            all_chars.append(pair1 + pair2)

# Print all characters
for code in all_chars:
    expression = "u'\u" + code + "'"
    print "{}: {}".format(code,eval(expression))

这是我得到的错误信息:

Traceback (most recent call last): File "C:\Users\andr7495\Desktop\unifun.py", 
line 18, in <module> print "{}: {}".format(code,eval(expression))
UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: 
ordinal not in range(128)

当尝试打印u"\u0080"时,会抛出异常,但在交互式解释器中却没有问题。

我已经尝试将结果转化为unicode并指定忽略错误,但这并没有帮助。我觉得我缺乏对unicode如何工作的基本理解,但是否有任何方法可以使我的代码打印出所有有效的unicode表达式?


尽量避免在循环中使用eval,特别是在编程中。 - Michał Šrajer
u"\u0080"控制字符...也许你无法打印它? - tmdavison
@tom 特别是当他在标准的Windows cmd.exe提示符上打印时 :P - Joran Beasley
在Windows控制台中显示超出chcp编码范围的字符,请安装win-unicode-console软件包。请参阅Python,Unicode和Windows控制台 - jfs
可能是如何打印所有Unicode字符?的重复问题。 - Alex Hall
5个回答

15
import sys
for i in xrange(sys.maxunicode): 
  print unichr(i);

1
甚至可以使用sys.maxunicode + 1(将U+10FFFF非字符视为其他非字符)来处理。 - jfs
在我的系统(Mac)上,这会显示许多相同的字形,表示“此字体在此代码页中没有该字形”(在您的浏览器中如何或是否显示该字符可能会有所不同:在 Mac 上的 Firefox 中,它打印为一个问号在一个块中;在 Windows 上的 Firefox 中,它显示为十六进制数字在一个块中),还有很多其他独特的可打印字形。我该如何过滤掉当前显示字体+代码页中不存在的字形?我只能想象使用freetype编写自定义解决方案(可执行文件):/ - Alex Hall

0

这很可能是您终端的问题(cmd.exe 在这方面非常糟糕),因为大多数时候当您“打印”时,您正在向终端打印,这最终会尝试进行编码...如果您在 idle 或其他可以呈现 Unicode 的空间中运行代码,则应该能够看到字符。此外,您不应该使用 eval,请尝试这个。

for uni_code in range(...):
    print hex(uni_code),unichr(uni_code)

0

你正在尝试将Unicode字符格式化为字节字符串。你可以通过使用Unicode字符串来消除错误:

print u"{}: {}".format(code,eval(expression))
      ^

其他答案更好地简化了原始问题,但是你肯定正在用一种困难的方式进行操作。

0
这是本文示例的重写,将列表保存到文件中。
Python 3.x:
import sys 
txtfile = "unicode_table.txt"
print("creating file: " + txtfile) 
F = open(txtfile, "w", encoding="utf-16", errors='ignore')
for uc in range(sys.maxunicode):
    line = "%s %s" % (hex(uc), chr(uc))
    print(line, file=F)
F.close()

0
import sys
import unicodedata
import time

for i in range(0x1000,0xFFFF+1):
    try:
        print(f"U+{i:06X}\t{chr(i)}\t{unicodedata.name(chr(i)):<}")
    except ValueError:
        print(f"u+{i:06X} not in unicode characters table")
        # time.sleep(0.3)
        continue

1
你的回答可以通过提供更多支持性的信息来改进。请编辑以添加进一步的细节,比如引用或文献,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined

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