尝试创建包含希伯来字母和数字的字符串时会出现奇怪的行为。数字将始终显示在字母左侧。例如:
string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;
textBlock1.Text = AB;
//Ouput bug - B is left to A.
只有在使用希伯来字母和数字时才会出现此错误。当省略等式中的一个时,错误将不会发生:
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.
我尝试使用FlowDirection属性,但它没有帮助。
欢迎在第一个代码示例中正确显示文本的解决方法。
答案 0 :(得分:13)
为此目的创建了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;
答案 1 :(得分:4)
这是因为Unicode Bidirectional Algorithms。如果我理解正确的话,unicode字符有一个“标识符”,表示当它紧挨着另一个单词时应该在哪里。
在这种情况下\u05E9
说它应该在左边。即使你这样做:
var ab = string.Format("{0}{1}", a, b);
你仍会把它拿到左边。但是,如果您使用另一个非编码字符,例如\u05D9
,则会将其添加到右侧,因为该字符不在左侧。
这是语言的布局,当输出时,布局将根据语言布局输出。
答案 2 :(得分:0)
奇怪的行为有解释。具有unicode字符的数字被视为unicode字符串的一部分。当希伯来语从右向左阅读时,情景将会给出
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的一部分。所以输出是 - 首先是A
,然后是B
。
现在考虑我自己的情景
string A = "\u05E9";
string B = "\u05EA";
string AB = A + B;
A
和B
都是从右到左阅读lang的一部分,因此AB
为B
,后跟A
。不是A
后跟B
。
已编辑,要回答评论
考虑到这种情况 -
string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;
获得字母后跟数字的唯一解决方案是:string AB = B + A;
很多,不是一般会起作用的解决方案。所以,我想你必须根据要求实现一些检查条件和构建字符串。
答案 3 :(得分: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.