识别无法打印的Unicode字符

4
我需要确定(或预测)何时Unicode字符无法打印。例如,如果我在默认设置下打印此Unicode字符,则可以正常打印:
>>> print(u'\ua62b')
ꘫ

但如果我打印另一个Unicode字符,它会打印出一个愚蠢、奇怪的正方形:

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

我需要在字符打印之前确定它是否会显示为一个丑陋的方块(有时是匿名空白)。这是什么原因,如何预测?与此相关的是IT技术。


我不确定这是一个容易解决的问题,它取决于输出终端和终端使用的字体。 - DanielGibbs
@DanielGibbs 啊!如果这是字体相关的,我应该能够解析字体信息,对吧?或者选择一个已知限制的字体?我应该能够确定终端的已知信息。不过...是什么决定了终端的这个特性呢? - john_science
实际上,在你的情况下,问题似乎是\ua62c字符并不是一个有效的Unicode字符,所以你可能需要首先进行某种检查。 - DanielGibbs
@DanielGibbs 啊,原来如此!好的,这是我不知道的一件事……那么,有些Unicode ID指向“无效”的字符?我不知道这是一件事。有没有检查有效性的方法? - john_science
1个回答

4
虽然很难确定运行脚本的终端(或您的终端使用的字体)是否能正确呈现给定字符,但您至少可以检查该字符是否有表示形式。 字符"\ua62b"被定义为"VAI SYLLABLE NDOLE DO",而字符"\ua62c"没有定义,因此可能会呈现为方块或其他通用符号。 检查字符是否已定义的一种方法是使用unicodedata模块
>>> 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'

非常感谢您的及时回复。我学到了一些关于Unicode的知识。看起来我有一些阅读要做。谢谢! - john_science

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