python - 在 Python 中显示 unicode 字符串的宽度

标签 python string unicode width python-unicode

<分区>

如何确定 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

最佳答案

您有多种选择:

  1. 一些控制台支持转义序列以精确定位光标。不过,可能会造成一些套印。

    历史记录:这种方法用于 Amiga 终端,通过打印一行文本然后将光标向下移动一个像素来在控制台窗口中显示图像。文本行的剩余像素慢慢构建图像。

  2. 在您的代码中创建一个表格,其中包含控制台/终端窗口中使用的字体中所有 Unicode 字符的实际(像素)宽度。使用一个 UI 框架和一个小的 Python 脚本来生成这个表。

    然后添加使用此表计算文本实际宽度的代码。不过,结果可能不是控制台中字符宽度的倍数。结合像素精确的光标移动,这可能会解决您的问题。

    注意:您必须为连字 (fi, fl) 和 composites 添加特殊处理.或者,您可以在不打开窗口的情况下加载 UI 框架,并使用图形基元计算字符串宽度。

  3. 使用制表符(\t)缩进。但这只有在您的 shell 实际上使用真实文本宽度来放置光标时才有用。许多终端只会简单地计算字符数。

  4. 创建一个包含表格的 HTML 文件并在浏览器中查看它。

关于python - 在 Python 中显示 unicode 字符串的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22225441/

相关文章:

python - Python 中只将一个变量传递给函数

C语言对字符串中的一个序列进行计数

c++ - C/C++ 将编码设置为 UNICODE.. 如何将 'ă' 写入文件

python - Django、字符串编码、UTF-8 和问题 - AttributeError : 'Cursor' object has no attribute '_last_executed'

python 脚本转储 ELF(核心和输出)?

python - Pandas DataFrame 乘以数组

python - 在 Python 中,如何对列表进行切片以获得第一个元素,以及除最后一个元素之外的所有元素?

java - 星号字母错误对齐java

objective-c - NSString(或字符串)的长度是否影响 isEqualToString 的性能 : (or ==)?

javascript - 发送 POST 数据时阻止 Safari 规范化 Unicode?