测量终端中unicode字符串的显示宽度
项目描述
简介
此库主要用于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>解决方案 strong>使用wcswidth正确确定字符串长度
>>> from wcwidth import wcswidth >>> print(wcswidth('コンニチハ')) 10 >>> print(wc_rjust('コンニチハ', 20, '_')) __________コンニチハ
选择版本
导出环境变量,< span class="docutils literal">UNICODE_VERSION span>。这应该在< em>终端仿真器 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
用途
此库用于
jquast/blessed:一个围绕Python中终端功能的薄而实用的包装器。
prompt-toolkit/python-prompt-toolkit:用于在Python中构建强大交互式命令行的库。
dbcli/pgcli:具有自动完成和语法高亮的Postgres CLI。
thomasballinger/curtsies:一个类似于Curses的终端包装器,其显示基于基于2d文本数组的合成。
selectel/pyte:简单的VTXXX兼容的linux终端仿真器。
astanin/python-tabulate:在Python中格式化表格数据,一个库和命令行实用程序。
rspeer/python-ftfy:修复了Unicode文本中的mojibake和其他问题。
nbedos/termtosvg:终端录制器,可以将会话渲染为SVG动画。
peterbrittain/asciimatics:帮助人们创建全屏文本用户界面的包。
python-cmd2/cmd2:用于构建交互式命令行应用程序的工具。
stratis-storage/stratis-cli:Stratis项目的命令行界面。
ihabunek/toot:Mastodon的CLI/TUI客户端。
saulpw/visidata:用于发现和整理数据的终端电子表格多工具。
其他语言
timoxley/wcwidth:JavaScript
Text::CharWidth:Perl
bluebear94/Terminal-WCWidth:Perl 6
grepsuzette/wcwidth:Haxe
fumiyas/wcwidth-cjk:LD_PRELOAD覆盖
joshuarubin/wcwidth9:C中的Unicode版本9
历史
- 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
- 0.2.9 2023-10-30
- 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
特性:现在 wcswidth() 为(大多数)组合字符确定可打印长度。开发者工具 bin/wcwidth-browser.py 已改进,以在提供 --combining 选项时显示 组合 字符(Thomas Ballinger 和 Leta Montopoli PR #5)。
特性:将静态分析(prospector)添加到测试框架中。
- 0.1.3 2014-10-29 Pre-Alpha
修复错误:wcswidth 的第二个参数未被尊重。(Thomas Ballinger,PR #4)。
- 0.1.2 2014-10-28 Pre-Alpha
更新 表格以符合 Unicode 规范 7.0.0。(Thomas Ballinger,PR #3)。
- 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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5 |
|
MD5 | 5ce8dd9e6993dae268142feb1e605cd8 |
|
BLAKE2b-256 | 6c6353559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598 |