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

时间:2011-07-06 10:26:24

标签: c# .net string unicode unicode-string

尝试创建包含希伯来字母和数字的字符串时会出现奇怪的行为。数字将始终显示在字母左侧。例如:

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

欢迎在第一个代码示例中正确显示文本的解决方法。

4 个答案:

答案 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;

AB都是从右到左阅读lang的一部分,因此ABB,后跟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.