C# 希伯来文字符串concat,数字结果顺序错误

C# 希伯来文字符串concat,数字结果顺序错误,c#,string,hebrew,C#,String,Hebrew,我试图从语言文件中提取一个字符串,并在执行过程中包含一个变量。问题在于,根据语言的不同,变量的位置会有所不同。在希伯来语中,似乎不可能将变量放在末尾。我无法使用字符串插值,因为我正在从资源文件中提取字符串。 看见 有什么提示吗 我使用的代码是: // the {0} should be positioned at the end of the Hebrew string <data name="BeforeStartingYourMeeting" xml:space="preserve"&

我试图从语言文件中提取一个字符串,并在执行过程中包含一个变量。问题在于,根据语言的不同,变量的位置会有所不同。在希伯来语中,似乎不可能将变量放在末尾。我无法使用字符串插值,因为我正在从资源文件中提取字符串。 看见 有什么提示吗

我使用的代码是:

// the {0} should be positioned at the end of the Hebrew string
<data name="BeforeStartingYourMeeting" xml:space="preserve">
  <value>{0}פני התחלת הישיבה שלך</value>
</data>
我读过:

这个案例正好描述了我的问题:

我想到了以下解决方法,但最终还是遇到了同样的问题:

<data name="BeforeStartingYourMeeting" xml:space="preserve">
  <value>פני התחלת הישיבה שלך {time}</value>
</data>

时间
代码清楚地显示了这个问题。不同的输入字符串但相同的输出!!!看起来它与字符串的显示有关,字符串必须采用特定的RTL格式。如果我将生成的行复制/复制到文本板中,则第二行不同。

如@Avi在其中所述:

unicode字符“RTL标记”(U+200F)和“LTR标记”(U+200E) 正是为了这个目的而创造的。”

参考: -

代码可以按如下方式更新:

string heText1 = "פני התחלת הישיבה שלך time";
string timePattern1 = "time";
Console.WriteLine(heText1.Replace(timePattern1,"\u200e" +DateTime.Now.ToString("dd/MM/yyyy")));
小提琴


注意:我仍然无法在资源文件中存储带有{0}模式的希伯来文字符串,不得不接受使用巨大的{time}模式并进行替换。

“似乎不可能将变量放在末尾”为什么?希伯来文(显然所有RTL语言)的问题通常是{}被视为LTR字符,而希伯来语是RTL(从右到左)。因此它将
字符串中的符号“{}”移动到一些无效位置(主要在字符串的末尾)为了了解您的具体问题,我们需要更多地了解该问题,请提供您正在处理的数据示例,并使用字符串插值编写不需要的代码work@styx它将变量移到字符串中的其他位置。很可能是由于Fabjan@Fabjan谢谢你的解释ch是有意义的。我已经用代码更新了帖子。你的代码应该可以运行,你自己检查一下:确保你的格式字符串中没有隐藏字符。尝试将你的字符串复制到一个测量字符串长度的工具中,并确保你看到了正确的数字。Y,我刚刚尝试了这个:string a=string.format(“קמ\”ש\u200e{0}“,1);这提供了预期的答案,数字在右边。虽然资源文件似乎会导致读取unicode时出现问题,但不需要丑陋的黑客。如果我找到解决方案,将更新。因此,我使用resharper的本地化,langRes是我的资源文件引用。通过使用
“קמ\”ש\u200e{0}“
在资源中,我可以得到如下工作方式:
string.Format(langRes.Form1\u Form1\u 0\u Km\u h.Replace(“\\u200e”,“\u200e”),speed);
替换有点难看,但仍然可以。
string heText1 = "פני התחלת הישיבה שלך time";
string timePattern1 = "time";
Console.WriteLine(heText1.Replace(timePattern1,"\u200e" +DateTime.Now.ToString("dd/MM/yyyy")));