双向文本
外观
(重定向自 Bidi)
来自 Wikipedia:Bidirectional text,是指包含两种文本方向,从右到左(RTL)和从左到右(LTR)的文本。
概念
- 文本方向
- 编辑时,设置文本方向会改变编辑器与文本的交互方式。它会影响文本导航、选择和插入。
- 文本对齐
- 一种风格化的文本呈现方式。例如:英文文本可以右对齐,尽管它是一种LTR语言,但这不会改变文本的LTR方向。
- 伪双向文本
- 一种伪本地化设置,会完全颠倒英文句子以模仿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塑形)
- 正确应用字母渲染和连字。参见Wikipedia:HarfBuzz和Wikipedia:Complex 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#双向支持 |
| notepadqqAUR | 是 | 否 | 否 | 无法修复。 |
| texworks | 是 | 是 | 否 | |
| vim | 否 | 否 | 是 | 参见Vim#双向支持 |
| featherpad | 是 | 是 | 否 | |
| Visual Studio Code | 是 | 否 | 否 | |
| mousepad | 是 | 是 | 否 | |
| pluma | 是 | 是 | 否 | |
| GTK | 是 | 是 | 否 | |
| xed | 是 | 是 | 否 |
Terminal
VTE-based 终端支持改变双向行为的特殊转义序列。例如,要为命令输出启用UBA支持,请使用echo '\e[?2501h'。要了解更多关于双向转义序列的信息,请参阅[1]。
| 应用 | RTL | UBA | 导航 | 备注 |
|---|---|---|---|---|
| alacritty | 否 | 否 | 否 | 在2024-01-03的alacritty版本0.13.0-3下测试。不支持RLO (U+202E)。 |
| contour | 否 | 否 | 否 | 在2024-01-03的contour版本0.3.12下测试。不支持RLO (U+202E)。 |
| dvtm | 否 | 否 | 否 | |
| extraterm | 否 | 否 | 否 | 在2024-01-03的extraterm-bin版本0.74.0-1AUR下测试。不支持RLO (U+202E)。 |
| kitty | 是 | 否 | 在2024-01-02的kitty版本0.31.0-1下测试。不支持RLO (U+202E)。 | |
| konsole | 是 | 否 | 在2024-01-02的konsole版本23.08.4-2下测试。 | |
| libvte | 是 | 否 | 包括libvte-based,如Gnome、sakura、xfce4、terminator... minor issues: 1 | |
| mltermAUR | 是 | 否 | 在2024-01-03的mlterm版本3.9.3-2AUR下测试。 | |
| neatvi-gitAUR | 否 | |||
| pymux | 否 | |||
| qterminal | 否 | 否 | 在2024-01-02的qterminal版本1.4.0-1下测试。不支持RLO (U+202E)。 | |
| radare2 | 否 | |||
| Terminator | 是 | 否 | 在2024-01-02的terminator版本2.1.3-3下测试。 | |
| tmux | 否 | 无法修复 | ||
| Urxvt | 否 | 否 | 在2024-01-03的rxvt-unicode版本9.31-4下测试。不支持RLO (U+202E)。 | |
| wezterm | 否 | |||
| xstAUR | 否 | |||
| less | – | 否 | – |
其他
| 应用 | RTL | UBA | 备注 |
|---|---|---|---|
| electronjs | 否 | ||
| groff | 否 | 否 | |
| irssi | 否 | ||
| latex | 是 | 是 | 使用LuaTeX或XeLaTeX配合polyglossia |
| Pandoc | 是 | 否 | |
| typst | 是 | 否 | |
| Wikipedia:HTML | 是 | 是 | |
| wine | 是 | 否 |
故障排除
首先验证UTF-8编码是否已正确配置。确保安装了您语言对应的字体:阿拉伯语,波斯语,希伯来语。对于某些终端,需要(bicon-gitAUR)才能正确显示RTL文本。