跳转到主要内容

测量终端中unicode字符串的显示宽度

项目描述

Downloads codecov.io Code Coverage MIT License

简介

此库主要用于CLI程序,这些程序会仔细为终端生成输出,或者假装是模拟器。

问题陈述:大多数字符串的可打印长度等于它们在屏幕上占用的单元格数 1个字符 : 1个单元格。然而,有一些字符类别会 占用2个单元格(全宽),还有其他字符会 占用0个单元格(零宽度)。

解决方案:POSIX.1-2001和POSIX.1-2008兼容的系统提供wcwidth(3)wcswidth(3) C函数,此Python模块的函数正好复制。 这些函数返回unicode字符串预期占用的单元格数。

安装

此软件包的稳定版本由pypi维护,使用pip安装

pip install wcwidth

示例

问题:给定以下短语(日语),

>>>  text = u'コンニチハ'

Python 错误地使用5个码点的字符串长度而不是10个单元格的可打印长度,因此当使用< cite>rjust 函数时,输出长度是错误的

>>> print(len('コンニチハ'))
5

>>> print('コンニチハ'.rjust(20, '_'))
_______________コンニチハ

通过定义我们自己的“rjust”函数,该函数使用wcwidth,我们可以纠正这一点

>>> def wc_rjust(text, length, padding=' '):
...    from wcwidth import wcswidth
...    return padding * max(0, (length - wcswidth(text))) + text
...

我们的< strong>解决方案使用wcswidth正确确定字符串长度

>>> from wcwidth import wcswidth
>>> print(wcswidth('コンニチハ'))
10

>>> print(wc_rjust('コンニチハ', 20, '_'))
__________コンニチハ

选择版本

导出环境变量,< span class="docutils literal">UNICODE_VERSION。这应该在< em>终端仿真器或那些尝试自己编写一个的开发人员通过shell完成

$ export UNICODE_VERSION=13.0

如果未指定,则使用最新版本。如果您的终端仿真器不导出此变量,您可以使用jquast/ucs-detect实用程序自动检测并将其导出到您的shell中。

wcwidth, wcswidth

使用函数wcwidth()确定单个Unicode字符的长度,以及使用wcswidth()确定多个,一个Unicode字符字符串的长度。

简要来说,函数wcwidth()的返回值是

-1

不可确定(不可打印)。

0

不移动光标,如NULL或组合。

2

类别为东亚宽(W)或东亚全角(F)的字符,使用两个终端单元格显示。

1

所有其他字符。

函数wcswidth()简单地返回字符串中每个字符的所有值的总和,或者当它在字符串的任何位置发生时返回-1

完整的API文档在https://wcwidth.readthedocs.org

开发

以可编辑模式安装wcwidth

pip install -e .

使用tox执行单元测试

tox -e py27,py35,py36,py37,py38,py39,py310,py311,py312

更新Unicode版本

从最新的Unicode规范数据文件重新生成python代码表

tox -e update

脚本位于bin/update-tables.py,需要Python 3.9或更高版本。建议但不是必须使用最新版本的Python运行此脚本,因为最新版本的Python具有用于生成注释的最新unicodedata

构建文档

此项目使用sphinx 4.5构建文档

tox -e sphinx

输出将位于docs/_build/html/

更新需求

此项目使用pip-tools管理需求。

要更新Unicode版本的需求,运行

tox -e update_requirements_update

要更新测试的需求,运行

tox -e update_requirements37,update_requirements39

要更新构建文档的需求,运行

tox -e update_requirements_docs

实用工具

用于浏览和测试宽Unicode字符终端的辅助工具位于该项目的源代码的bin/中。只需确保首先从这个项目的主要文件夹中运行pip install -r requirements-develop.txt

python ./bin/wcwidth-browser.py

用途

此库用于

其他语言

历史

0.2.13 2024-01-06
  • 修复 对韩文Hangul Jamo的零宽度支持

0.2.12 2023-11-21
  • 重新发布以移除wheel文件中放错的.pyi文件,相关问题#101

0.2.11 2023-11-20
0.2.10 2023-11-13
  • 修复 使用U+FE0F变体选择器16对某些类型的emoji序列进行计数(PR #97)。

  • 更新 规范

0.2.9 2023-10-30
  • 修复 在Emoji ZWJ序列、巴厘语、Jamo、德文纳加里语、泰米尔语、卡纳达语等中使用零宽度字符(PR #91)。

  • 更新 包含字符测量规范的规范

0.2.8 2023-09-30
  • 将需求文件包含在源分布中(PR #82)。

0.2.7 2023-09-28
  • 更新 表格以包含Unicode规范15.1.0。

  • 将bin、docs和tox.ini包含在源分布中

0.2.6 2023-01-14
  • 更新 表格以包含Unicode规范14.0.0和15.0.0。

  • 变更 开发者工具以使用pip-compile,并在bin/update-tables.py中使用jinja2模板进行代码生成,以准备可能的编译器优化发布。

0.2.1 .. 0.2.5 2020-06-23
  • 仓库变更 以更新测试和打包问题,并开始使用与发布版本相匹配的标签标记仓库。

0.2.0 2020-06-01
  • 增强 通过导出环境变量UNICODE_VERSION(例如13.0或6.3.0)选择Unicode版本。有关自动检测的信息,请参阅jquast/ucs-detect CLI实用程序。

  • 增强 API文档发布到readthedocs.org。

  • 更新 包含版本4.1.0至13.0中发布文件的所有 Unicode规范表格。

0.1.9 2020-03-22
  • 性能优化 由Avram Lubkin完成,PR #35

  • 更新 表格以包含Unicode规范13.0.0。

0.1.8 2020-01-01
  • 更新 表格以包含Unicode规范12.0.0。(PR #30)。

0.1.7 2016-07-01
  • 更新 表格以符合 Unicode 规范 9.0.0。(PR #18)。

0.1.6 2016-01-08 生产/稳定
  • LICENSE 文件现在包含在发行版中。

0.1.5 2015-09-13 Alpha
  • 修复错误:解决了“组合字符宽度”问题,特别是那些以前返回 -1 的现在通常(正确地)返回 0。由 Philip Craig 通过 PR #11 解决。

  • 弃用:模块路径 wcwidth.table_comb 已不再可用,已被模块路径 wcwidth.table_zero 取代。

0.1.4 2014-11-20 Pre-Alpha
0.1.3 2014-10-29 Pre-Alpha
0.1.2 2014-10-28 Pre-Alpha
0.1.1 2014-05-14 Pre-Alpha
  • 首次发布到 pypi,基于 Unicode 规范 6.3.0

此代码最初直接从同名 C 代码派生而来,其最新版本可在 https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c 获取。

* Markus Kuhn -- 2007-05-26 (Unicode 5.0)
*
* Permission to use, copy, modify, and distribute this software
* for any purpose and without fee is hereby granted. The author
* disclaims all warranties with regard to this software.

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解更多关于 安装软件包 的信息。

源代码发行版

wcwidth-0.2.13.tar.gz (101.3 kB 查看哈希值)

上传时间 源代码

构建发行版

wcwidth-0.2.13-py2.py3-none-any.whl (34.2 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持