创建正确路径从左到右连接从右到左部分的问题

时间:2010-12-17 21:53:53

标签: c# string cultureinfo

我已经大大简化了问题,这里是示例代码:

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的最终值为:

第一个条目\اول\دوم\最后一个条目\

而不是

首次输入\دوم\اول\ Last entry \

中间的右到左部分被翻转为一个单元。

感谢您的提前时间。

2 个答案:

答案 0 :(得分:5)

您有一个bidi字符串(包含LTR和RTL字符的字符串),并且.NET在输出字符串时在LTR和RTL模式之间切换。标点符号被认为是“弱”并继续使用当前活动的任何方向。因此,您输出一个LTR字符串(“第一个条目”),后跟一串RTL字符(来自myString [1] + 3,来自myString [2]的3个字符串),后跟一个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 :(得分:1)

执行以下操作会更容易

System.IO.Path.Combine(myStrings);

如果您正在尝试制作路径。