9

There is a strange behavior when trying to create string which contains a Hebrew letter and a digit. The digit will always be displayed left to the letter. For example:

string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;
textBlock1.Text = AB;
//Ouput bug - B is left to A.

This bug only happens when using both a Hebrew letter and digits. When omitting one of those from the equation the bug won't happen:

string A = "\u20AA"; //Some random Unicode.
string B = "23";
string AB = A + B;
textBlock1.Text = AB;
//Output OK.

string A = "\u05E9"; //A Hebrew letter.
string B = "HELLO";
string AB = A + B;
textBlock1.Text = AB;
//Output OK.

I tried playing with FlowDirection property but it didn't help.

A workaround to get the text displayed properly in the first code exmaple would be welcomed.

4

4 回答 4

15

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

在您的示例中,只需在希伯来字符后放置一个 LTR 标记,然后数字将显示在希伯来字符的右侧,如您所愿。

所以你的代码将被调整如下:

string A = "\u05E9"; //A Hebrew letter
string LTRMark = "\u200E"; 
string B = "23";
string AB = A + LTRMark + B;
于 2012-09-06T19:13:25.773 回答
4

这是因为Unicode 双向算法。如果我理解正确,则 unicode 字符有一个“标识符”,当它与另一个单词相邻时,它应该在哪里。

在这种情况下\u05E9,它应该在左边。即使你这样做:

var ab = string.Format("{0}{1}", a, b);

你仍然会得到它的左边。但是,如果您使用另一个这样的 unicode 字符,\u05D9则会将其添加到右侧,因为该字符不是在左侧。

这是语言的布局,输出时布局引擎将根据语言布局输出。

于 2011-07-06T10:46:24.607 回答
0

那奇怪的行为有解释。带有 unicode 字符的数字被视为 unicode 字符串的一部分。并且由于从右到左阅读希伯来语 lang,场景将给出

string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;

B首先出现,其次是A

第二种情况:

string A = "\u20AA"; //Some random Unicode.
string B = "23";
string AB = A + B;

A是一些 unicode,而不是从右到左读取的 lang 的一部分。所以输出是 - 首先AB.

现在考虑我自己的情况

string A = "\u05E9";
string B = "\u05EA";
string AB = A + B;

两者AB都是从右到左阅读语言的一部分,因此后面AB是. 后面没有。BAAB

编辑,回答评论

考虑到这种情况 -

string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;

获得字母后跟数字的唯一解决方案是:string AB = B + A;

prolly,不是一个普遍适用的解决方案。所以,我想你必须实现一些检查条件并根据要求构建字符串。

于 2011-07-06T11:16:08.670 回答
0
string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = B + A; // !
textBlock1.Text = AB;
textBlock1.FlowDirection = FlowDirection.RightToLeft;
//Ouput Ok - A is left to B as intended.
于 2011-07-06T12:50:10.577 回答