C6.30.3Visual caret versus logical insertion point设计研究

光标视觉位置与文本逻辑插入点在双向文本中可能不直观对应

别名: 视觉逻辑错位 · bidi caret mismatch · 插入点直觉

概念解释

即使用户盯着闪烁条,也不一定能从它的屏幕位置推断逻辑插入点——下一个码点将进入缓冲区的哪一个下标。双向排版把逻辑邻近拆到画面两端,把画面邻近贴上逻辑远邻。点击“看起来在这个词后面”可能落到另一个词的逻辑前面。这种不直观对应是混排的认知问题:不是光标画错了像素,而是像素不再是下标的单调函数。

机制

在单向文本里,屏幕 x 与逻辑下标近似单调,点击 x 可以二分查找。混排之后映射是分段单调,同一 x 可能对应两个下标,同一下标在换行前后还可能有两个视觉位置(行末/行首)。用户的直觉是“箭头指着的缝就是插入处”,在镜像的 run 里这条缝的逻辑身份反了。屏幕阅读器报的是逻辑偏移,视力用户看的是像素,两者对不上时协作编辑会各改各的位置。调试若只打印 caret 的 x 而不打印逻辑索引,会把绘制问题与索引问题混为一谈。

怎么研究

让人在混排句子上指出“我想插在这个词后面”,再看系统实际索引。用颜色标出逻辑下标,让另一组人根据颜色预测闪烁条应在哪。测量点击目标词两侧时的索引误差。材料要用真实的人名+品牌+数字,而不是随机字母。眼动看他们是否在接缝处反复确认。

边界

单向、且不换行的短句,映射仍单调,直觉成立。等宽编辑器若按逻辑序显示(不应用双向重排),视觉与逻辑重新对齐,但阅读 RTL 会变难——那是用可读性换可编辑性。纯终端里有时用隔离标记把一段当成黑箱,内部不再暴露给点击。

怎么落地

  • 在开发者工具和内部调试中同时显示视觉矩形与逻辑索引。
  • 对最终用户,在不直观的接缝用分裂光标或词级高亮,而不是一根细线。
  • 点击命中先吸附到词边界,再在词内按 run 方向解释。
  • 验证:把混排句的每个逻辑间隙编号,请人点“第 n 个间隙对应的画面位置”,统计对上的比例;对不上的间隙必须有额外视觉提示。

延伸

  • 同组C6.30.1 从右向左文字的光标移动方向与视觉前进方向相反 · C6.30.2 双向文本混排时,光标在方向切换点的位置需要额外规则判定所在逻辑序 · C6.30.4 方向键左右移动光标的语义需要按文本方向重新映射,不能假设固定对应
  • 相邻C6.13 文本选择与光标定位 · C6.14 放大镜与光标微调
  • 站内检索logical order · visual order · caret mapping

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/C6.30.3