[英]Unicode strings in .Net with Hebrew letters and numbers
嘗試創建包含希伯來字母和數字的字符串時有一種奇怪的行為。 數字將始終顯示在字母左側。 例如:
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標記”(U + 200F)和“LTR標記”(U + 200E)。
在您的示例中,只需在希伯來字符后面放置一個LTR標記,然后數字將顯示在希伯來字符的右側,如您所願。
所以你的代碼將調整如下:
string A = "\u05E9"; //A Hebrew letter
string LTRMark = "\u200E";
string B = "23";
string AB = A + LTRMark + B;
這是因為Unicode雙向算法 。 如果我理解正確的話,unicode字符有一個“標識符”,說明當它在另一個單詞旁邊時它應該在哪里。
在這種情況下\ש
說它應該在左邊。 即使你這樣做:
var ab = string.Format("{0}{1}", a, b);
你仍然會把它拿到左邊。 但是,如果您使用另一個非\י
字符,例如\י
則會將其添加到右側,因為該字符不會出現在左側。
這是語言的布局,當輸出時,布局將根據語言布局輸出。
那個奇怪的行為有解釋。 具有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;
多產,而不是一般可行的解決方案。 所以,我想你必須實現一些檢查條件並根據要求構建字符串。
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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.