. 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属性,但它没有帮助。

让文本在第一个代码示例中正确显示的解决方案将是受欢迎的。

. net中带有希伯来字母和数字的Unicode字符串

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的一部分,从右向左读取。所以输出是-先AB

现在考虑我自己的场景

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

AB都是从右向左读lang的一部分,所以ABB,然后是A。而不是AB

编辑,回答评论

考虑到这个场景-

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.