【问题标题】:Problem creating correct path concatenating left to right with right to left sections创建从左到右与从右到左部分连接的正确路径的问题
【发布时间】:2010-12-17 21:53:53
【问题描述】:

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

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

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

而不是

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

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

提前感谢您的宝贵时间。

【问题讨论】:

    标签: c# string cultureinfo


    【解决方案1】:

    您有一个双向字符串(包含 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 标记。

    【讨论】:

      【解决方案2】:

      下面的操作会更容易

      System.IO.Path.Combine(myStrings);
      

      如果您正在尝试创建路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多