c# - 创建从左到右与从右到左部分连接的正确路径时出现问题

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

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

代替

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

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

提前感谢您抽出时间。

最佳答案

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

关于c# - 创建从左到右与从右到左部分连接的正确路径时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475067/

相关文章:

c# - 自定义中性文化不显示在 Visual Studio Winform 语言组合框中

c# - OpenXML Excel 如何在 SharedStringTable 中更改单元格的值

c# - 如何将参数传递给Azure函数

ruby - Ruby 中二进制字符串的问题

sql-server - sql server认为空字符串等于一些字符

c# - if else 或 switch 的当前 CultureName?

c# - 具有多个存储库的 ASP.NET MVC Controller ?

c# - Xamarin 安卓 : typesafe FindViewById

c - 在替换从文本文件中读取的单词的程序中,如何解释不同的单词长度?

c# - 如何使用 TypeConverter 转换特定于文化的 double ?