识别无法打印的 unicode 字符

Identify unicode characters that can't be printed

我需要能够确定(或预测)Unicode 字符何时不可打印。例如,如果我在默认设置下打印这个 unicode 字符,它打印得很好:

>>> print(u'\ua62b')
ꘫ

但是如果我打印另一个 unicode 字符,它会打印成一个愚蠢、奇怪的方块:

>>> print(u'\ua62c')
꘬

我真的需要能够在打印字符之前确定它是否会像这样显示为丑陋的正方形(或有时显示为匿名空白)。是什么原因造成的,我该如何预测?

虽然判断终端 运行 您的脚本(或您的终端使用的字体)是否能够正确呈现给定的字符不是很容易,但您至少可以检查该字符是否确实具有代表。

字符 \ua62b 被定义为 VAI SYLLABLE NDOLE DO,而字符 \ua62c 没有定义,因此它可能被呈现为正方形或其他通用符号。

检查字符是否已定义的一种方法是使用 unicodedata module:

>>> import unicodedata
>>> unicodedata.name(u"\ua62b")
'VAI SYLLABLE NDOLE DO'
>>> unicodedata.name(u"\ua62c")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: no such name

正如您在上面看到的,\ua62c 字符引发了 ValueError,因为它未定义。

另一种方法是查看字符的类别。如果是 Cn 则字符未分配:

>>> import unicodedata
>>> unicodedata.category(u"\ua62b")
'Lo'
>>> unicodedata.category(u"\ua62c")
'Cn'