🟡 [M2] Unicode 显示宽度全部视为 1,CJK/emoji 包裹位置错误 #12

Closed
opened 2026-06-03 13:53:56 +08:00 by dailz · 1 comment
Owner

文件: core/io/wrap.rs:17-28
分类: 渲染 / Unicode

问题: 包裹逻辑将每个非 Tab Unicode 标量视为显示宽度 1。CJK 字符、emoji、组合标记、零宽字符的宽度都被错误计算。

建议修复: 使用 unicode-width crate (UnicodeWidthChar/UnicodeWidthStr) 处理宽字符和零宽字符。

**文件**: `core/io/wrap.rs:17-28` **分类**: 渲染 / Unicode **问题**: 包裹逻辑将每个非 Tab Unicode 标量视为显示宽度 1。CJK 字符、emoji、组合标记、零宽字符的宽度都被错误计算。 **建议修复**: 使用 `unicode-width` crate (`UnicodeWidthChar`/`UnicodeWidthStr`) 处理宽字符和零宽字符。
dailz added the severity/mediumarea/iobug labels 2026-06-03 13:53:56 +08:00
dailz closed this issue 2026-06-07 12:50:22 +08:00
Author
Owner

修复已合并: b58d66f

变更内容

  • crates/core/src/io/wrap.rs: wrap_line_chars 中将硬编码 width=1 替换为 unicode-width crate 的 UnicodeWidthChar::width(),正确处理 CJK (width=2)、emoji (width=2)、零宽字符 (width=0) 和控制字符 (width=0)。
  • Cargo.toml + crates/core/Cargo.toml: 添加 unicode-width = "0.2" 直接依赖。
  • 新增 7 个测试覆盖 CJK、CJK+ASCII 混合、零宽字符、emoji、组合标记、width=1 边界场景。

已知限制(超出本 Issue scope)

  • Grapheme cluster 拆分: 标量迭代可能拆散组合标记与基础字符。日志场景中极少出现,风险可接受。
  • 控制字符可见化: 控制字符(除 tab)width 设为 0 但仍原样推入 row,未转为可见占位符。可作后续 Issue。
**修复已合并**: b58d66f ### 变更内容 - `crates/core/src/io/wrap.rs`: `wrap_line_chars` 中将硬编码 `width=1` 替换为 `unicode-width` crate 的 `UnicodeWidthChar::width()`,正确处理 CJK (width=2)、emoji (width=2)、零宽字符 (width=0) 和控制字符 (width=0)。 - `Cargo.toml` + `crates/core/Cargo.toml`: 添加 `unicode-width = "0.2"` 直接依赖。 - 新增 7 个测试覆盖 CJK、CJK+ASCII 混合、零宽字符、emoji、组合标记、width=1 边界场景。 ### 已知限制(超出本 Issue scope) - **Grapheme cluster 拆分**: 标量迭代可能拆散组合标记与基础字符。日志场景中极少出现,风险可接受。 - **控制字符可见化**: 控制字符(除 tab)width 设为 0 但仍原样推入 row,未转为可见占位符。可作后续 Issue。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#12