Отображает арабский текст справа налево в PowerShell

Оригинальный текст $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

Возможно, есть другой метод, более легкий и простой.

🤔 А знаете ли вы, что...
PowerShell может использоваться для анализа журналов событий и поиска проблем в системе.


3
132
1

Ответ:

Решено

Ваш симптом подразумевает отсутствие поддержки двунаправленного рендеринга текста в вашем терминальном приложении, которое, судя по скриншоту, является хостом консоли 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, никто на самом деле не знает, как двунаправленный текст должен взаимодействовать с различными символами управления терминалом, такими как перемещение/чтение позиции курсора, очистка до конца строки и другие.