Строка, содержащая английские sh и буквы иврита, искажается после String.Join () - C#. NET - PullRequest
0 голосов
/ 13 июля 2020

У меня есть строка, содержащая символы английского sh и иврита:
"Hitachi - היטצ'י:Hitachi – cartel CRT"

1-й шаг: переверните две части, разделенные :.
Ожидаемый результат: "Hitachi – cartel CRT:Hitachi - היטצ'י"

Далее : Я хотел бы объединить следующий текст: ":אגם:עץ תיוק"
Окончательный ожидаемый результат: "Hitachi - cartel CRT:Hitachi - אגם:עץ תיוק:היטצ'י"

Фактический результат: "Hitachi – cartel CRT:Hitachi - היטצ'י:אגם:עץ תיוק"

Это мой текущий код:

string path = "Hitachi - היטצ'י:Hitachi – cartel CRT";
string[] splittedByColonPath = path.Split(':');
Array.Reverse(splittedByColonPath);
List<string> list = new List<string>(splittedByColonPath);
list.Add("אגם:עץ תיוק:");            
string result = String.Join(":", list.ToArray());

Любой идеи, как это правильно переставить?

1 Ответ

2 голосов
/ 13 июля 2020

String.Join работает нормально, и строка именно такая, какой вы хотите ее видеть. (Вы можете проверить это, если хотите, написав код для печати строки по одному символу за раз, по одному символу в каждой строке.) Проблема в том, что когда отображает it, весь текст на иврите и двоеточия рассматривается как одна фраза, а поскольку иврит в основном пишется справа налево, это означает, что первое слово во фразе отображается справа.

В зависимости от того, чего вы хотите достичь, это может быть нормально (например, если вы передаем его в другую программу, которая ожидает данных, разделенных двоеточиями - в этом случае строка может выглядеть неправильно, но другая программа ее интерпретирует нормально). Но если вы хотите, чтобы он выглядел так, как вы ожидаете, вы должны заставить алгоритм отображения обрабатывать двоеточия как слева направо. Вы можете сделать это, изменив код на

string result = String.Join("\u200e:"), list.ToArray());

\u200e - это маркер слева направо (LRM), в результате чего любая смежная пунктуация обрабатывается как слева направо. -right.

Обратной стороной этого является то, что любая другая программа, интерпретирующая данные, может не ожидать LRM и может быть этим сбита с толку.

...