ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

为什么某些Unicode字符会错位?东亚宽度问题与mermaid-ascii的解法

为什么某些Unicode字符会错位?东亚宽度问题与mermaid-ascii的解法 为什么某些Unicode字符会错位东亚宽度问题与mermaid-ascii的解法【免费下载链接】mermaid-asciiRender Mermaid graphs inside your terminal项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-ascii用 mermaid-ascii 在终端里渲染流程图、时序图时很多新手都会遇到同一个灵异现象只要参与者名称里出现中文或日文右边的竖线就集体向右漂移箭头对不齐边框。这不是 bug而是**东亚宽度East Asian Width**问题。什么是东亚宽度错位终端本质是一张等宽网格每个字符占一个固定列宽的格子。英文字母、数字占 1 格而中日韩全角字符如中、客占2 格组合附加符号占0 格。如果程序天真地按字符个数计算宽度就会出错客户 2 个字符但实际显示宽度 4 列│ 客户 │ ← 按字符数算宽右边框少了2列边框断裂 │ 客户 │ ← 按显示宽度算宽完美对齐 这就是为什么同样一段 ASCII 图纯英文标签整齐一混入 CJK 就错位。问题根源Unicode 宽度并不唯一Unicode 规范把字符的显示宽度分为几类终端渲染时各取所宽类别宽度典型例子WideW2 列汉字、假名、全角标点AmbiguousF1 或 2 列○、①、制表符类符号NeutralN1 列字母、数字、┌─┐等绘图字符Zero-WidthZW0 列组合变音符、零宽空格其中最阴险的是Ambiguous 类同一个字符在英文终端占 1 列、在 CJK 终端占 2 列行为随环境而变。mermaid-ascii 的解法量宽度而不是数字符mermaid-ascii 的核心思路很简单——所有布局计算都基于显示宽度而非 rune 个数时序图渲染器在 pkg/sequence/renderer.go 中实现了displayWidth()逐字符测量宽度后累加全角记 2、零宽记 0再据此决定边框、箭头和生命线的落点。流程图标签在 pkg/graph/label.go 中用runewidth.StringWidth()计算每行真实宽度保证盒子高度和边距一致。宽度测量依赖成熟的go-runewidth库天然覆盖 Wide / Ambiguous / Zero-Width 三大类字符。针对 Ambiguous 字符项目还做了保守选型在 pkg/sequence/charset.go 中中心连接标记刻意选用o而不是○源码注释写得很直白——○是 East-Asian-ambiguous 宽度会在 CJK 终端里破坏列对齐。验证CJK 字符矩阵测试项目内置了一整套 CJK 回归测试数据覆盖日文、中文混排、组合变音符和零宽字符等边界场景cmd/testdata/sequence/cjk_feature_matrix.txt日文参与者 中文消息 框/框选/循环/备注的完整功能矩阵cmd/testdata/sequence/east_asian_participants.txt东亚参与者对齐测试cmd/testdata/sequence/combining_marks_mixed_width.txt组合附加符号与混合宽度其中 CJK 功能矩阵的渲染结果节选参与者顧客 / 服务 / 監査 / 数据库全部对齐│ ┌──────┐ ┌──────┐ │ ┌──────┐ ┌────────┐ │ │ 顧客 │ │ 服务 │ │ │ 監査 │ │ 数据库 │ │ └───┬──┘ └───┬──┘ │ └───┬──┘ └────┬───┘给新手的 3 个实用建议终端字体确保终端使用支持 CJK 的等宽字体如 Sarasa / 更纱黑体否则即使程序算对了宽度字体本身也会把全角撑成 2.x 倍宽。避免 Ambiguous 符号在节点/参与者命名中少用○、①这类宽度不确定的字符换用明确的 ASCII 替代。终极保险如果运行在 CJK 终端上仍出现偏差可加--ascii参数切换纯 ASCII 渲染模式见 README.md 中 Only ASCII 一节纯 ASCII 在任何终端都不会错位。理解显示宽度 ≠ 字符数这一个概念你就能看懂终端 ASCII 图排版背后的所有玄机——而 mermaid-ascii 正是把这个概念贯彻到每一根边框线上的。【免费下载链接】mermaid-asciiRender Mermaid graphs inside your terminal项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-ascii创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表