尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Mole 多语言支持:实用解析 CJK 字符宽度,中文终端不再错位

Mole 多语言支持:实用解析 CJK 字符宽度,中文终端不再错位 Mole 多语言支持实用解析 CJK 字符宽度中文终端不再错位【免费下载链接】Mole Clean, uninstall, analyze, optimize, and monitor your Mac. Free open-source CLI, plus a native Mac app.项目地址: https://gitcode.com/GitHub_Trending/mole15/Mole当你用 Mole 分析一个装满中文资料的文件夹表格里的中文文件名把列挤得参差不齐长名字直接顶出屏幕。问题往往不在翻译而在字符宽度CJK中日韩统一表意文字字符占两列按字节算就必错位。Mole 多语言支持把这层算准。读完你能定位自己终端中文错位的根源也知道该动哪个设置。它到底能帮你做什么功能全景中文应用名在列表里对齐显示打开mole clean或mole analyze的应用清单微信、富途牛牛这类中文名和英文应用排在同一基线上右侧的大小列没有因为几个汉字而整体漂移。行宽够用时完整显示不够时整齐收进省略号。背后靠的是 lib/core/ui.sh 里的get_display_width它把每个汉字按 2 列计、ASCII 按 1 列计整行再按这个宽度对齐而不是按字节数硬排。超长中文文件名被整齐截断mole analyze扫到一个叫非常长的中文项目交付物终稿备份.txt的文件时你会看到名字被截成头部 … 尾部的形式中间省略结尾保留扩展名。断点永远落在整字边界上不会出现半个字符的残影。Shell 侧由truncate_by_display_width逐字符累计宽度、预留出 3 列放省略号后截断Go 侧的 cmd/analyze/format.go 里有同思想的truncateMiddle测试用例在 cmd/analyze/format_test.go 中覆盖了 CJK 截断场景。中文路径的超链接依旧可点在mole analyze的输出里点一个含中文和空格的文件夹路径终端会直接把它打开链接不会因为特殊字符而失效。管道输出到文件时自动退化为纯文本不夹杂控制符。实现在 lib/core/base.shpercent_encode_path先把路径逐字节转义format_path_link再包成 OSC 8 超链接一种终端内嵌 file:// 链接的转义协议中文和空格都能安全通过。背后的工作机制CJK 字符宽度怎么算⚡️ 整条链路按读 locale → 测宽度 → 截断 → 编码四步走全部集中在 lib/core/ 的几个共享函数里。如何临时切换语言环境调用前先存下当前的LC_ALL原值。切到LC_ALLen_US.UTF-8再取${#str}得到 UTF-8 字符数。切到LC_ALLC再取一次得到字节数。用完立即恢复原值原本没设过就unset。两次测量、立刻还原这套存-改-还模式保证了测量过程不污染外层 shell 的排序和格式化行为。怎样计算 CJK 字符宽度若字符数等于字节数说明纯 ASCII宽度直接取字符数。否则套公式宽度 字符数 (字节数 − 字符数) / 2。中是 1 字符 3 字节得 1 1 2。扫描字符串里的零宽连字ZWJU200D和 emoji 变体选择符VS16UFE0F把它们的数量从宽度里扣掉。第三步处理的是字节变多但肉眼不占列的情况比如带 emoji 修饰的文件夹名。如何按显示宽度截断中文文本先用get_display_width算总宽未超限原样返回。超限则逐字符走ASCII 记 1 列非 ASCII 记 2 列。每加一个字符前预留 3 列给 ...一超限就停手。末尾补 ... 输出断点必然在整字上。如何编码中文路径超链接percent_encode_path在LC_ALLC下逐字节循环字母数字和/._~-原样保留其余转成%XX。老版本 bash 3.2 对大于 127 的字节会返回负数这里用 255掩码回无符号字节。format_path_link把编码结果拼成file://URL显示文本仍用~缩写的原始路径。从默认到自定义多语言环境配置方法 先说结论装完就能用下面两项手动调整只在你遇到问题时才有必要。开箱即用配置位置无。直接运行mole analyze或mole clean即可。改什么参数不需要。宽度计算、截断、路径编码在每次渲染时自动完成。改完的效果中英文混排列表自动对齐连发布说明也是双语英文 Changelog 加中文更新日志并存于 docs/release-notes/。手动调整系统语言环境配置位置shell 启动文件macOS 上通常是~/.zshrc。改什么参数LC_ALL或LANG取值示例zh_CN.UTF-8或en_US.UTF-8。改完的效果影响终端自身的排序、日期等本地化行为Mole 测宽度时会临时强制切换 locale 并还原结果不受该值影响。终端字体配置位置Terminal.app 或 iTerm2 的设置面板Profiles 下的 Text 一项。改什么参数字体Font换成带 CJK 字形的字体或确认回退字体链覆盖中文。改完的效果汉字完整显示为方块字宽两列不再出现缺字的空心框。快速验证跑一次mole analyze指向一个含中文名的目录看表格右边界是否笔直对齐再点一条中文路径链接能打开文件即说明 locale 与字体两层都正常。常见坑与排查思路终端中文乱码避坑 以下四条都来自真实处理过的边界情况按出现频率排序。坑一文本工具报 illegal byte sequence 后整段结果变少现象进程表过滤、grep 匹配在遇到中文名应用时中断后续行全丢。原因UTF-8 locale 下 awk、grep 按字节比较时撞上多字节序列直接报错退出。解法给这些工具加LC_ALLC强制按字节比较Mole 在 lib/core/file_ops.sh 的进程过滤处就是这么做的。坑二中文名列宽算错表格整体错位现象按${#str}或字节数对齐中文行比英文行多出半截列宽。原因字符数、字节数、显示宽度是三回事汉字显示宽度恒为 2 列。解法统一走get_display_width的宽度值参与对齐别自己数长度。坑三自己写的编码函数遇到中文就溢出或截断现象file:// 链接含生僻字节时链接不可点或输出被截成半字节。原因bash 3.2 下printf %d $ch对高位字节返回负数没做掩码处理。解法参考percent_encode_path的写法 255回正后再格式化。坑四脚本里改了 locale 没还回去影响后续所有排序现象某个清理脚本跑完后sort顺序、日期格式集体变了。原因export LC_ALL...之后异常退出或漏写恢复逻辑。解法照抄存原值 → 切换 → 立即还原三步且把还原放在任何提前return之前。延伸与展望宽度、截断、编码已拆成独立函数扩展日文、韩文等其他宽字符语言可沿用同一套模式。Shell 与 Go 两侧mole analyze的扫描器各自维护一份宽度逻辑未来更可能收敛到一处。若你遇到新字体的错位或缺字案例欢迎去仓库 Issue 区反馈附上终端名称与字体即可。再回到开头那个装满中文文档的文件夹表格对齐了链接可点了错位的原因也定位得清了。Mole 多语言支持的核心就一句话——先算准宽度再谈显示。剩下的字体和环境设置按上一节的顺序调一遍就行。【免费下载链接】Mole Clean, uninstall, analyze, optimize, and monitor your Mac. Free open-source CLI, plus a native Mac app.项目地址: https://gitcode.com/GitHub_Trending/mole15/Mole创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表