<分区>
如何确定 Python 3.x 中 Unicode 字符串的显示宽度,有没有办法使用该信息将这些字符串与 str.format()
对齐?
激励示例: 将字符串表打印到控制台。一些字符串包含非 ASCII 字符。
>>> for title in d.keys():
>>> print("{:<20} | {}".format(title, d[title]))
zootehni- | zooteh.
zootekni- | zootek.
zoothèque | zooth.
zooveterinar- | zoovet.
zoovetinstitut- | zoovetinst.
母 | 母母
>>> s = 'è'
>>> len(s)
2
>>> [ord(c) for c in s]
[101, 768]
>>> unicodedata.name(s[1])
'COMBINING GRAVE ACCENT'
>>> s2 = '母'
>>> len(s2)
1
可以看出,str.format()
简单地将字符串中的代码点数 (len(s)
) 作为其宽度,从而导致输出中的倾斜列。搜索 unicodedata
模块,我没有找到任何建议的解决方案。
Unicode 规范化 可以解决 è 的问题,但不能解决通常具有更大显示宽度的亚洲字符。类似地,存在零宽度 unicode 字符(例如,允许单词内换行的零宽度空间)。您无法通过规范化解决这些问题,因此请不要建议“规范化您的字符串”。
编辑:添加了关于规范化的信息。
编辑 2:在我的原始数据集中,还有一些欧洲组合字符,即使在标准化后也不会产生单个代码点:
zwemwater | zwemw.
zwia̢z- | zw.
>>> s3 = 'a\u0322' # The 'a + combining retroflex hook below' from zwiaz
>>> len(unicodedata.normalize('NFC', s3))
2