【问题标题】:Hebrew string concat with digit results in wrong order带有数字的希伯来语字符串 concat 导致顺序错误
【发布时间】:2019-11-10 07:56:00
【问题描述】:

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

我正在使用的代码是:

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

我稍后会尝试通过以下方式在代码中使用该字符串:

string timeLeft = appointment.Start.Subtract(DateTime.Now).TotalMinutes + " min";
string timeBeforeMeetingLabel = string.Format(Properties.Resources.BeforeStartingYourMeeting, timeLeft);

我已阅读:

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

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

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

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

【问题讨论】:

  • "好像不可能把变量放在最后"为什么?
  • 希伯来语(显然是所有 RTL 语言)的问题通常是像“{”这样的符号被视为 LTR 字符,而希伯来语是 RTL(从右到左)。因此它将string.Format 中的符号“{}”移动到一些无效位置(主要是在字符串的末尾),然后引发异常。要了解您的具体问题,我们需要了解有关该问题的更多信息,请提供您正在使用的数据示例并使用无效的字符串插值进行编码
  • @styx 它将变量移动到字符串中的其他位置。很可能是由于Fabjan指出的原因
  • @Fabjan 感谢您的解释,这是有道理的。我已经用代码更新了帖子。
  • 您的代码应该可以工作,自己检查一下:dotnetfiddle.net/8kPRvA 确保您的格式字符串中没有隐藏字符。尝试将您的字符串复制到测量字符串长度的工具并确保您看到正确的数字

标签: c# string hebrew


【解决方案1】:

正如@Avi 在他的post 中所说:

"Unicode 字符“RTL 标记”(U+200F) 和“LTR 标记”(U+200E) 正是为此目的而创建的。”

参考: - https://docs.microsoft.com/en-us/globalization/input/text-rendering#directionality-control-marks

代码可以更新如下:

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

小提琴code.

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

【讨论】:

  • 嘿,我刚试过这个: string a = string.Format(" קמ\"ש \u200e{0}", 1); 这提供了预期的答案,右边的数字。不需要丑陋的黑客
  • 虽然看起来资源文件会导致读取 unicode 出现问题。如果我找到解决方案会更新。
  • 所以我使用的是 resharper 的本地化,而 langRes 是我的资源文件参考。通过在资源中使用"קמ\"ש \u200e{0}",我可以得到这样的东西:string.Format(langRes.Form1_Form1__0__Km_h.Replace("\\u200e", "\u200e"), speed); 替换有点难看,但仍然可以。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2018-01-24
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多