2010-11-24 53 views
5

貨幣符號放置我正在開發一些代碼來呈現貨幣符號,在我的應用程序標籤的一部分,我必須以Unicode十六進制格式貨幣符號的參考名單。在我的代碼,我格式化貨幣如下:在.NET字符串

(貨幣符號)(十進制字符串)(貨幣描述的)

這種方法適用於大多數符號,但是我注意到,一些符號是即使明確地放置在左側,也會自動移動到十進制值的右側。使用調試器時,即使在字符串本身的最基本層面上,我也會看到這種行爲,所以這不是在表示層中呈現更高級別的任何操作的情況。下面的代碼給出了簡單的情況下表現出的問題:

string rialSymbol = "\ufdfc"; 
string amount = "123.45"; 
string description = "Rials"; 
string plainConcat = rialSymbol + " " + amount + " " + description; 
Debug.WriteLine(plainConcat); 

調試輸出(其中還發生了什麼應用程序UI看到匹配)如下:

123.45(里亞爾符號)里亞爾

(注:符號是小數點而左側的權利,規定)

我已經嘗試了許多方法和品種字符串格式化,格式化文化等,但似乎沒有解決這個問題。如何在不使框架決定相對於十進制值的符號位置的情況下強制執行unicode字符的放置?這適用於大多數其他字符,爲什麼Rial(以及其他一些字符)會導致這種基本字符串行爲?

回答

9

U+FDFC是從右到左Unicode字符。它意味着嵌入在從右到左的文本中。您正在混合從左到右和從右到左的文本。

Wikipedia

在Unicode編碼,所有非標點符號都存儲在書寫順序。這意味着字符的書寫方向存儲在字符中。如果是這種情況,則該字符被稱爲「強」。但是標點符號可以出現在LTR和RTL腳本中。它們被稱爲「弱」字符,因爲它們不包含任何方向信息。所以由軟件決定這些「弱」字符將放置在哪個方向。有時(在混合方向文本),這導致顯示錯誤,造成由通過文本運行並確定LTR和RTL強字符和一個方向分配給弱字符比迪算法,根據該算法的規則。

在該算法中的級聯強字符的每個序列被稱爲「運行」。位於具有相同方向的兩個強壯角色之間的弱角色將繼承他們的方位。位於具有不同書寫方向的兩個強字符之間的弱字符將繼承主要上下文的寫入方向(在LTR文檔中字符將變爲LTR,在RTL文檔中,它將變爲RTL)。如果一個「弱」字符跟着另一個「弱」字符,算法將會看第一個相鄰的「強」字符。 有時會導致無意的顯示錯誤。這些錯誤通過「僞強」字符進行糾正或防止。這樣的Unicode控制字符稱爲馬克。標記U + 200E(從左到右的標記)或U + 200F(從右到左的標記)將被插入到一個位置,以使封閉的弱字符繼承其寫入方向。

例如,要在阿拉伯文(RTL)段中正確顯示英文名牌(LTR)的U + 2122™商標符號,如果未遵守該符號,則會在商標符號後插入LRM標記通過LTR文本。如果未添加LRM標記,弱字符™將與強烈的LTR字符和強烈的RTL字符相鄰。因此,在RTL上下文中,它將被視爲RTL,並以不正確的順序顯示。

因此,解決辦法是增加一個U + 200E左至右符號從右到左貨幣符號後:

string rialSymbol = "\ufdfc\u200e"; 
string amount = "123.45"; 
string description = "Rials"; 
string plainConcat = rialSymbol + " " + amount + " " + description; 
Debug.WriteLine(plainConcat); 
+0

非常感謝您!正是我需要的。 – DMG 2010-11-24 22:51:50