C6.30.2Caret at bidi boundary设计研究

双向文本混排时,光标在方向切换点的位置需要额外规则判定所在逻辑序

别名: 双向边界 · bidi 切换点 · 逻辑序判定

概念解释

同一行里阿拉伯文夹英文、或中文夹希伯来文时,会出现方向切换点:逻辑上相邻的两个字符在画面上并不相邻,或画面上相邻的两侧分属不同逻辑位置。插入点停在这个边界,系统必须额外规定:下一次击键进入哪一段、退格删哪一侧。只说“RTL 光标往左”不够,因为边界上左右两侧的方向相反。Unicode 双向算法给出绘制,编辑器还要在边界上选一个逻辑索引。

机制

双向算法把字符分成 runs,每段有方向。逻辑串 阿拉伯+Latin+阿拉伯 画出来可能是:右侧阿拉伯、中间 Latin 仍从左向右、左侧又是阿拉伯。画面上 Latin 的左缘紧贴第二段阿拉伯的右缘,但逻辑上 Latin 夹在两段阿拉伯之间。caret 若画在这个视觉接缝,对应两个候选逻辑索引(Latin 前或后)。常见规则:跟随键盘即将输入的文字方向,或跟随段落基方向,或显示一对“分裂光标”。选错索引,英文字母会插进阿拉伯词内部。数字常被当成弱方向字符,边界规则对电话号码特别敏感。

怎么研究

构造含一次和多次方向切换的短串(名字+英文品牌、RTL 段落中的 URL),在每个视觉接缝处点击和用方向键走,记录插入后字符落在哪一段。对比分裂光标与单光标实现。请混排母语使用者标出他们以为会插入的位置。自动化可在每个逻辑索引画 caret 并截视觉坐标,找一对多映射。

边界

没有嵌入反向文字时不存在切换点。强制方向标记(LRO/RLO)会制造人工边界,测试材料若含这些标记,结果不能代表普通用户。纯图片代替文字的界面没有逻辑序。竖排混排的切换规则又不同,不能直接搬横排 bidi。

怎么落地

  • 在方向接缝处使用分裂光标或明确高亮“下一次将进入的 run”。
  • 点击落在接缝时,按即将输入的语言选择逻辑索引,而不是总选段落基方向。
  • URL、代码、电话号码用隔离嵌入,减少弱方向字符把边界搅乱。
  • 验证:在 RTL 句子中间点选一个英文单词的左缘和右缘,分别输入一个字母,确认字母进入该单词而不是两侧的阿拉伯词。

延伸

  • 同组C6.30.1 从右向左文字的光标移动方向与视觉前进方向相反 · C6.30.3 光标视觉位置与文本逻辑插入点在双向文本中可能不直观对应 · C6.30.4 方向键左右移动光标的语义需要按文本方向重新映射,不能假设固定对应
  • 相邻C6.13 文本选择与光标定位 · C6.25 输入法状态与切换
  • 站内检索bidi boundary · split caret · directional run

同组卡片

快捷操作

分享

分享当前页面

ios_share

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