Оригинальный текст $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
Возможно, есть другой метод, более легкий и простой.
-@SantiagoSquarzon Спасибо за информацию. Но основное использование — в файле ps1. Консоль предназначена только для тестирования.
В ISE он работает настолько, насколько это того стоит.





Ваш симптом подразумевает отсутствие поддержки двунаправленного рендеринга текста в вашем терминальном приложении, которое, судя по скриншоту, является хостом консоли Windows (conhost.exe, который создает обычные отдельные консольные окна).
Поскольку терминал Windows имеет ту же техническую основу, что и хост консоли, на момент написания этой статьи первый, к сожалению, также не имеет такой поддержки.
Популярная сторонняя альтернатива ConEmu также не имеет поддержки.
Даже встраивание явных символов RTL (справа налево), таких как АРАБСКАЯ БУКВА, U+061C, не помогает.
И наоборот, приложения, которые поддерживают двунаправленный текст, автоматически правильно отображают встроенный текст на арабском языке, т. е. RTL; Код Visual Studio является примером.
Ваш обходной путь, включающий перестановку символов, не только громоздок, но и подходит только для вывода на экран, поскольку он включает в себя изменение строковых данных.
Существуют некоторые эмуляторы терминала (приложения), которые уже поддерживают двунаправленный текст, в частности собственный терминал macOS, Terminal.app, и, возможно, некоторые из них доступны в Linux.
Однако, похоже, до сих пор остаются нерешенными фундаментальные вопросы о том, как обрабатывать двунаправленный текст в эмуляторах терминала, как отмечается в вышеупомянутой проблеме ConEmu GitHub:
Кажется, что способ, которым Unicode описывает символы двунаправленной печати текста в правильном порядке, требует предварительного знания полного текста (куска текста). Это не совсем практично для терминала. Поэтапная печать символов может изменить положение ранее напечатанных символов.
Судя по https://www.arabeyes.org/ArabeyesTodo#Terminal_Emulators, никто на самом деле не знает, как двунаправленный текст должен взаимодействовать с различными символами управления терминалом, такими как перемещение/чтение позиции курсора, очистка до конца строки и другие.
Очень подробное объяснение. Большое спасибо.
даже стрелки вправо и влево в редакторе vscode поменяны местами 🤣