跳转到主要内容

检测交互式终端的Unicode支持

项目描述

ucs-detect

无参数时,

$ ucs-detect

ucs-detect 会自动测试终端模拟器的Unicode版本和支持水平,包括宽字符、表情符号零宽度连接符(ZWJ)序列、表情符号变体选择器-16(VS-16)序列以及零宽度或组合字符,并按支持的语言打印简短报告到标准输出。

video demonstration of running ucs-detect

安装 & 使用

要安装或升级

$ pip install -U ucs-detect

要使用

$ ucs-detect

运行详细测试并将yaml报告存储到磁盘

$ ucs-detect --save-yaml=data/my-terminal.yaml --limit-codepoints=5000 --limit-words=5000 --limit-errors=500

测试结果

测试了Windows、Linux和Mac上超过二十种现代终端,其结果已收集到这个仓库中,并已在URL https://ucs-detect.readthedocs.io/results.html 发布了详细总结。

一篇描述ucs-detect的开发过程并总结ucs-detect 1.0.4版本(2023年11月)结果的文章发布在 https://www.jeffquast.com/post/ucs-detect-test-results/

这些终端的个体yaml数据文件报告也可以在仓库文件夹 data 中检查,https://github.com/jquast/ucs-detect/tree/master/data

请注意,结果将与终端模拟器项目共享,并且随着它们对Unicode支持的改进,这些信息可能会过时。请不要期望ucs-detect的维护者更新这些数据文件。如果您希望为任何特定的终端更正此报告,请随时提交一个更新yaml数据文件的pull请求。

问题

许多东亚语言包含宽(W)或全角(F)字符,这意味着每个字符占用2个单元格而不是1个。此外,许多语言包含特殊的“零宽度”组合字符,这意味着它们不占用任何单元格,只修改前一个字符作为“组合”字符。最后,还有用于Emoji字符的“零宽度连接符”和“变体选择器-16”字符。

显示这些字符的终端应用程序可能难以确定它将如何显示给最终用户。由于Unicode联盟定期发布Unicode标准的新版本,但库和应用程序的源代码并不同时或根本不更新,因此这个问题经常发生!

最后,终端模拟器可能具有不同级别的支持。例如,在撰写本文时,微软的Terminal.exe支持Unicode 15.0的宽字符,缺少对Unicode 13.0的27个字符的支持,没有对Emoji ZWJ的支持,完全支持所有VS-16序列,但未能正确分类许多世界语言的88个或更多零宽度字符。

解决方案

最重要的因素是确定终端模拟器是否遵守由python库wcwidth发布的规范

这个程序,ucs-detect,能够自动检测连接的终端对WIDE、ZERO、ZWJ和VS-16字符的Unicode版本和功能级别支持。

它的工作原理

该程序中的解决方案是使用查询光标位置终端序列,该序列询问,“光标在哪里?”。这是一个终端模拟器自动响应的隐藏序列。

通过使用此序列和wcwidth库的数据表,我们可以测试python库wcwidth规范的符合性。

使用查询光标位置的想法受到X11随带的resize(1)程序的启发,该程序在无法通过信号通信或通过环境值转发的情况下确定终端大小,例如通过串行线。resize(1)简单地移动到(999, 999)然后询问,“我的光标在哪里?”然后根据响应理解终端大小。

UNICODE_VERSION(已弃用)

在1.0之前的ucs-detect版本仅服务于单一目的,即导出与sh兼容的行以导出UNICODE_VERSION。为了继续这一目的,使用--shell --quick,例如

$ ucs-detect --shell --quick
UNICODE_VERSION=15.0.0; export UNICODE_VERSION

它被设计为用于交互式使用

$ eval "$(ucs-detect --quick --shell)"
$ echo $UNICODE_VERSION
15.0.0

环境变量 UNICODE_VERSION 当前被 python wcwidth 库使用,该库包含每个过去的 Unicode 表版本,用于确定 Python 程序(如 IPython)如何渲染宽字符和零宽度字符。

历史

  • 1.0.7(2024-01-06):添加对 yaml 文件保存的 python 3.10 兼容性,并将 wcwidth 的要求更新到 0.2.13。

  • 1.0.6(2023-12-15):UDHR 数据的分发修复和 python 3.8 至 3.11 的错误修复。ucs-detect 欢迎新项目贡献者 @GalaxySnail

  • 1.0.5(2023-11-13):设置最小的 wcwidth 发布版本要求。

  • 1.0.4(2023-11-13):添加对 VS-16 和更多完整测试的支持。发布测试结果。

  • 1.0.3(2023-10-28):放弃对 python 2 的支持。添加更多高级测试。在未带参数调用时更改默认行为,使用 ucs-detect --quick --shell 使用与先前版本行为相匹配的新版本。

  • 0.0.4(2020-06-20):初始发布和错误修复

项目详情


下载文件

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

源分布

ucs_detect-1.0.7.tar.gz (646.2 kB 查看哈希值

上传时间

构建分布

ucs_detect-1.0.7-py2.py3-none-any.whl (686.3 kB 查看哈希值

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面