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