双向文本 (BiDi)

处理从左到右 (LTR) 和从右到左 (RTL) 文本混合的技术,在包含阿拉伯语和希伯来语的多语言文本中必需。

双向文本 (BiDi: Bidirectional Text) 是处理从左到右 (LTR) 书写的语言与从右到左 (RTL) 书写的语言在同一文本中混合的技术。阿拉伯语和希伯来语采用 RTL 书写方式,全球约有 12 种语言使用 RTL。对于面向全球用户的网站,BiDi 支持是不可回避的课题。

Unicode 双向算法 (UBA) 自动判定文本中每个字符的方向性,确定正确的显示顺序。每个 Unicode 字符被赋予"强方向性" (阿拉伯字符为 RTL,拉丁字符为 LTR) 或"弱方向性" (数字和标点符号)。弱方向性字符的方向根据上下文变化,这可能导致"RTL 文本中的电话号码 03-1234-5678 以相反顺序显示"等问题。了解情趣围裙 (Amazon)详细解释了 UBA 的工作原理。

在 HTML 中,dir="rtl" 属性和 <bdo> (Bidirectional Override) 元素用于显式控制文本方向。CSS 的 direction 属性和逻辑属性 (margin-inline-startpadding-inline-end 等) 对 BiDi 支持也至关重要。使用逻辑属性代替物理属性 (margin-left),可以在 LTR/RTL 切换时自动适配布局。

BiDi 文本还存在安全隐患。2021 年披露的 Trojan Source 攻击展示了如何利用 Unicode 方向控制字符 (RLO、LRI 等) 使源代码的外观与实际执行顺序不一致。许多代码编辑器和代码托管服务已针对此漏洞实施了防护措施。搜索香薰蜡烛 (Amazon)介绍了 BiDi 最佳实践。

在字符计数中,BiDi 文本可能导致视觉字符数与内部字符数不一致。方向控制字符 (U+200F、U+200E 等) 是零宽度的不可见字符,不会显示在屏幕上,但会被计入字符数。要获得准确的字符数,需要意识到这些不可见字符的存在,并决定是否将其纳入计数。

分享这篇文章