检测要导出的交互式终端的Unicode版本

ucs-detect的Python项目详细描述


此CLI实用程序确定终端的Unicode版本,并打印 sh-用于导出的兼容变量:

$ ucs-detect
UNICODE_VERSION=12.0.0; export UNICODE_VERSION

然后python wcwidth库使用此环境变量来 确定python程序(如IPython)和其他程序如何使用 python-prompt-toolkit呈现零宽度和宽unicode字符。在

如果不导出此变量,python wcwidth库假定 最新的。在

安装和使用

sh-兼容的shell:

^{pr2}$

要使其自动执行,请将以下语句添加到shell(bash)配置文件中:

if [ -z "$UNICODE_VERSION" ] && command -v ucs-detect >/dev/null; then
    eval "$(ucs-detect)"
fi

问题

中文、日文、韩文和表情符号都是“双宽”,占位 2个单元格,而不是1,其他一些特殊字符是“零宽度”。在

任何格式化和显示这些字符的终端应用程序都可能 无法确定如何向最终用户显示。这里有一个这样的 例如,从vercel/hyper终端:

An example of misaligned wide characters by the Hyper Terminal

这个问题经常发生,因为Unicode联盟发布了新版本 但库的源代码和 应用程序不会同时更新,或者根本不更新!在

许多语言和库仍然只符合Unicode 5.0,即 Markus Kuhn在2007年发布的最后一个版本wcwidth.c。在

解决方案

最重要的因素是确定:unicode的版本是什么 终端仿真器使用?

这个程序ucs-detect,能够自动检测的版本 连接终端支持的unicode。pythonwcwidth库 在撰写本文时,支持allUnicode版本,从4.1.0到12.1.0, 因此,它能够选择并匹配正确的宽度,方法是 UNICODE_VERSION环境变量的给定值。在

使用此解决方案,我们可以正确地确定UNICODE_VERSIONvercel/hyper终端为5.1.0,以及之前 错误对齐现在正确对齐:

An example of corrected alignment by Hyper Terminal

工作原理

unicode版本是使用Query Cursor Position终端确定的 sequence,它询问终端仿真器“光标在哪里?”?”. 在

通过为每个Unicode版本显示一系列宽Unicode字符 预期将光标前移2个单元格,最后一个成功的版本 高级2单元被确定为 终端仿真器。在

使用Query Cursor Position并导出sh变量的解决方案是 与分发的resize(1)程序使用的解决方案完全相同 X11,它决定了终端大小超过了不能 通信或转发(如通过串行线路)。在

进一步

我希望这个CLI工具是临时的。我想看看所有的终端模拟器 自动导出环境变量UNICODE_VERSION,并且 不需要工具。在

如果你想了解更多关于这个工具和相关问题的我希望 地址与这个环境变量,看看他的文章, https://jeffquast.com/post/terminal_wcwidth_solution/

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Kafka producer大量内存使用(泄漏?)   java NullPointerException。。。正在插入数据但无法检索数据[Mysql DB]   java spring+jpa+hibernate=没有可用于当前线程的实际事务的EntityManager无法可靠地处理“persist”调用   getelementbyid在没有ID的情况下如何在java中使用GetElementsById   java有没有一种使用WatchService强制轮询的方法?   java将值从jframe传递给另一个jframe并使用它   Java/Groovy中带重试的反应式事件处理   具有两个包装器元素的java Jackson XML ArrayList输出   java总是在范围内使用不同的随机元素   取消选择java下拉列表值   多线程如何在Java中为对象的不同成员拥有不同的同步块   java如何使用多线程从文本文件中读取输入   java Spring启动附加崩溃命令   java使用公共或单独的actionPerfomed方法有什么区别   java用Spring3.0中的SpEL替换JSP中的EL   java作为windows服务运行应用程序时无法访问共享文件夹   java xml 1.1规范中的“解析数据”是什么意思?   以编程方式设置JComboBox索引时java触发ItemListener   java Android WebView:只加载HTML,不加载JS或CSS(在某些设备中)   Java:计算do/while循环的数量