双向文本
来自 Wikipedia:双向文本,是包含两种文本方向性的文本,从右到左 (RTL) 和从左到右 (LTR)。
概念
- 文本方向
- 在编辑时,设置文本方向会改变编辑器与文本的交互。它会影响文本导航、选择和插入。
- 文本对齐
- 一种呈现文本的风格化形式。例如:英语文本即使是 LTR 语言,也可以右对齐,但这不会改变文本的方向,文本方向仍然是 LTR。
- 伪 Bidi
- 一个伪造的区域设置,显示完全反转的英语句子,以模拟 RTL 上下文。这有助于不熟悉 RTL 语言的人可视化 RTL 问题。例如
This English sentence contains SDROW CIBARA EMOS and ends with English words.
- 简易双向模式
- 在普通终端中自动进行视觉文本顺序从右到左的输入。
- 逻辑导航
- 单词按照阅读顺序被遍历。
- 可视导航
- 单词按照显示顺序被遍历。 这个 GIF 演示了两者之间的区别。
逻辑导航是程序应该实现的正确导航方式,以完全支持双向文本。
- Unicode 支持
- 在支持 Unicode 的文本编辑器中,可以通过在其前面插入特殊的格式化字符来控制文本方向:Wikipedia:RLM (U+200F), Wikipedia:LRM (U+200E),这是一种针对不支持切换文本方向的文本编辑器的变通方法。
- 双向算法
- 是应用于以正确顺序显示文本的规则集。
支持
为了使程序完全支持双向文本,它必须具备
- 文本整形 (RTL 整形)
- 正确应用字母渲染和连字。参见 W:harfbuzz 和 Complete Text Layout。
- Unicode 双向算法 (UBA)
- 确定文本段的方向性并应用适当的渲染规则。
- 编辑和输入 (导航)
- 强制文本方向以及光标移动、选择、删除和插入(逻辑导航)的正确行为的能力。
UBA 和字母整形的一些实现
- fribidi 是双向算法的一个开源实现。
- python-bidiAUR 是一个用于相关功能的 python 库。
- SheenBidi: C 语言中改进的 Unicode 实现。
浏览器
应用 | RTL | UBA | 导航 | 注释 |
---|---|---|---|---|
chromium | 是 | 否 | 否 | |
firefox | 是 | 否 | 否 | |
qtwebbrowser | 是 | 是 | 否 | |
webkit | 是 | 是 | 否 |
编辑器
应用 | RTL | UBA | 导航 | 注释 |
---|---|---|---|---|
AbiWord | 是 | 否 | 否 | |
emacs | 是 | 否 | 否 | 通过 扩展。另见:emacs 双向编辑。 |
gedit | 是 | 是 | 否 | 对于 Gedit <= 2.1,通过 扩展进行变通。 |
ghostwriter | 是 | 是 | 否 | 基于 Qtwebbrowser |
kate | 是 | 是 | 否 | |
LibreOffice | 是 | 否 | 是 | 参见:LibreOffice#双向支持 |
marktextAUR | 是 | 否 | 否 | 基于 Blink |
neovim | 否 | 否 | 是 | 参见 Vim#双向支持 |
notepadqq | 是 | 否 | 否 | 不会修复。 |
texworks | 是 | 是 | 否 | |
vim | 否 | [死链 2025-01-19 ⓘ] 否 | 是 | 参见 Vim#双向支持 |
featherpad | 是 | 是 | 否 | |
Visual Studio Code | 是 | 否 | 否 | |
mousepad | 是 | 是 | 否 | |
pluma | 是 | 是 | 否 | |
GTK | 是 | 是 | 否 | |
xed | 是 | 是 | 否 |
终端
基于 VTE 的终端支持特殊的转义序列,可以改变双向文本的行为。例如,要为命令输出启用 UBA 支持,请使用 echo '\e[?2501h'
。要了解更多关于双向文本转义序列的信息,请参阅 [1]。
应用 | RTL | UBA | 导航 | 注释 |
---|---|---|---|---|
alacritty | 否 | 否 | 否 | 已使用 alacritty 版本 0.13.0-3(2024-01-03)进行测试。不支持 RLO (U+202E)。 |
contour | 否 | 否 | 否 | 已使用 contour 版本 0.3.12(2024-01-03)进行测试。不支持 RLO (U+202E)。 |
dvtm | 否 | 否 | 否 | |
extraterm | 否 | 否 | 否 | 已使用 extraterm-binAUR 版本 0.74.0-1(2024-01-03)进行测试。不支持 RLO (U+202E)。 |
kitty | 是 | 否 | 已使用 kitty 版本 0.31.0-1(2024-01-02)进行测试。不支持 RLO (U+202E)。 | |
konsole | 是 | 否 | 已使用 konsole 版本 23.08.4-2(2024-01-02)进行测试。 | |
libvte | 是 | 否 | 包括 基于 libvte 的终端,如 Gnome, sakura, xfce4, terminator... 少量问题:1 | |
mlterm | 是 | 否 | 已使用 mltermAUR 版本 3.9.3-2(2024-01-03)进行测试。 | |
neatvi-git | 否 | |||
pymux | 否 | |||
qterminal | 否 | 否 | 已使用 qterminal 版本 1.4.0-1(2024-01-02)进行测试。不支持 RLO (U+202E)。 | |
radare2 | 否 | |||
Terminator | 是 | 否 | 已使用 terminator 版本 2.1.3-3(2024-01-02)进行测试。 | |
tmux | 否 | 不会修复 | ||
Urxvt | 否 | 否 | 已使用 rxvt-unicode 版本 9.31-4(2024-01-03)进行测试。不支持 RLO (U+202E)。 | |
wezterm | 否 | |||
xst | 否 | |||
less | – | 否 | – |
其他
应用 | RTL | UBA | 注释 |
---|---|---|---|
electronjs | 否 | ||
groff | 否 | 否 | |
irssi | 否 | ||
latex | 是 | 是 | 使用 LuaTeX 或 XeLaTeX 与 polyglossia |
Pandoc | 是 | 否 | |
typst | 是 | 否 | |
Wikipedia:HTML | 是 | 是 | |
wine | 是 | 否 |
故障排除
首先验证 UTF-8 编码配置正确。确保您安装了与您的语言对应的字体:阿拉伯语、波斯语、希伯来语。对于某些终端,需要 (bicon-gitAUR) 才能正确显示 RTL 文本。