Проблема создания правильного конкатенации контуров слева направо и справа налево - PullRequest
4 голосов
/ 18 декабря 2010

Я значительно упростил задачу, и вот пример кода:

string outputString = string.Empty;
string joinOutputString = string.Empty;
string pathOutputString = string.Empty;

string[] myStrings = new string[4];
myStrings[0] = "First entry";
myStrings[1] = "اول";
myStrings[2] = "دوم";
myStrings[3] = "Last entry";

StringBuilder sb = new StringBuilder();

for (int i = 0; i < myStrings.Length; i++)
{
    joinOutputString = string.Join(@"\", joinOutputString, myStrings[i]);
    outputString = string.Format(@"{0}{1}\", outputString, myStrings[i]);
    pathOutputString = System.IO.Path.Combine(pathOutputString, myStrings[i]);
    sb.Append(string.Format(@"{0}\", myStrings[i]));
}

Конечное значение всех строк и StringBuilder в конце цикла:

Первая запись \ اول \ دوم \ Последняя запись \

вместо

Первая запись \ دوم \ اول \ Последняя запись \

Средняя справа налево секция переворачивается как единое целоеединица.

Спасибо, что уделили время.

Ответы [ 2 ]

5 голосов
/ 18 декабря 2010

У вас есть строка двунаправленного текста (строка, содержащая и символы LTR, и символы RTL), и .NET переключается между режимами LTR и RTL при выводе строки.Пунктуация считается «слабой» и продолжает использовать то направление, которое в данный момент активно.Таким образом, вы выводите строку LTR («Первая запись»), за которой следует строка символов RTL (3 из myString [1] + «\» + 3 из myString [2]), за которой следует строка LTR («Последняя запись»).

myString [0] (печатный LTR), затем myString [1] (печатный RTL), затем myString [2] (печатный RTL), затем myString [3] (печатный LTR)

Обратите внимание, чтовся средняя строка (составленная из myString [1] + "\" + myString [2]) печатается RTL и, следовательно, транспонируется от вашего ожидания.Вы можете добавить псевдо-сильную метку LTR (символ Unicode 0x200E) для принудительного изменения направления.

http://en.wikipedia.org/wiki/Bi-directional_text

В вашем коде:

joinOutputString = string.Join("\\\x200E", joinOutputString, myStrings[i]);

Обратите внимание на\ - это экранированный символ \, а \ x200E - псевдосильная метка LTR.

1 голос
/ 18 декабря 2010

Было бы проще сделать следующее

System.IO.Path.Combine(myStrings);

, если вы пытаетесь проложить путь.

...