检测要导出的交互式终端的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终端:
这个问题经常发生,因为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,以及之前 错误对齐现在正确对齐:
工作原理
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/
- 项目
标签: