原文是
$text = "مرحبا بك في PowerShell"
当我将其粘贴到 PowerShell 中时,阿拉伯文本顺序自动变为反向:
我尝试用以下方法解决它:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
文字仍然
Left-to-Right
。Right-to-Left
?
最后我找到了
Reverse()
这样的方法:
$Text = "مرحبا بكم"
$charA = $Text.ToCharArray()
[array]::Reverse($charA)
-join $charA
也许还有另一种更容易、更简单的方法。
您的症状意味着您的终端应用程序缺乏双向文本渲染支持,从屏幕截图来看,它是 Windows 控制台主机(
conhost.exe
,它创建常规的单独控制台窗口)
因为 Windows Terminal 与控制台主机共享相同的技术基础,不幸的是,截至撰写本文时,前者也缺乏这种支持。
流行的第三方替代品ConEmu也缺乏支持。
即使嵌入显式的 RTL(从右到左)字符,例如阿拉伯字母标记、
U+061C
,也没有有帮助。
相反,支持双向文本的应用程序自动正确显示嵌入的阿拉伯文本,即 RTL; Visual Studio Code 是一个示例。
涉及反转字符的解决方法不仅麻烦,而且仅适用于 display 输出,因为它涉及修改字符串数据。
有一些终端模拟(应用程序)已经支持双向文本,特别是本机 macOS 终端 Terminal.app,可能还有一些在 Linux 上可用。
但是,关于如何在终端模拟器中处理双向文本,似乎仍然存在尚未解决的基本问题,正如前述 ConEmu GitHub 问题 所指出的那样:
Unicode 以正确的顺序描述双向文本打印字符的方式似乎需要提前了解全文(文本块)。这对于终端来说不太实用。增量打印字符可以更改先前打印字符的位置。
从 https://www.arabeyes.org/ArabeyesTodo#Terminal_Emulators 来看,没有人真正知道双向文本应如何与各种终端控制字符交互,例如移动/读取光标位置、清除直到行尾等。