. net中带有希伯来字母和数字的Unicode字符串
本文关键字:数字 字符串 Unicode net | 更新日期: 2023-09-27 18:01:24
当尝试创建包含希伯来字母和数字的字符串时,有一个奇怪的行为。数字总是显示在字母的左边。例如:
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属性,但它没有帮助。
让文本在第一个代码示例中正确显示的解决方案将是受欢迎的。
unicode字符"RTL mark" (U+200F)和"LTR mark" (U+200E)正是为此目的而创建的。
在您的示例中,只需在希伯来字符后面放置一个LTR标记,然后数字将显示在希伯来字符的右侧,如您所愿。
所以你的代码将调整如下:
string A = "'u05E9"; //A Hebrew letter
string LTRMark = "'u200E";
string B = "23";
string AB = A + LTRMark + B;
这是因为Unicode双向算法。如果我理解正确的话,unicode字符有一个"标识符",当它与另一个单词相邻时,表示它应该在哪里。
在这种情况下,'u05E9
说它应该在左边。即使你做了:
var ab = string.Format("{0}{1}", a, b);
你仍然会得到它的左边。然而,如果你取另一个单码字符,如'u05D9
,它将被添加到右边,因为该字符不是在左边。
这是语言的布局,当输出它时,布局引擎将根据语言布局输出它。
那种奇怪的行为是可以解释的。带有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的一部分,从右向左读取。所以输出是-先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;
很明显,这不是一个一般情况下可以工作的解决方案。所以,我猜你必须实现一些检查条件,并根据要求构建字符串。
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.