簡體   English   中英

.Net中的Unicode字符串,帶有希伯來字母和數字

[英]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;

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM