2013-01-24 64 views
5

我正在使用C#一個StringBuilder追加一些文本,可以是英語(從左到右)或阿拉伯語(從右到左)從右到左語言支架反

stringBuilder.Append("("); 
stringBuilder.Append(text); 
stringBuilder.Append(") "); 
stringBuilder.Append(text); 

如果text =「A」 ,則輸出爲 「(A)」

但是,如果文本= 「بتث」,則輸出爲 「(بتث)بتث」

任何想法?

+2

99.999%這不是代碼錯誤,而是您選擇的輸出。你看到這個輸出的地方? UI支持這兩個方向非常複雜,直到今天,即使gmail也存在重大問題。 –

回答

7

當被要求呈現從右到左的文本,阿拉伯語或希伯來語時,這是Windows文本呈現引擎中的一個衆所周知的缺陷。這是一個難以解決的問題,當語言中沒有好的替代詞時,人們往往會回到西方的文字和標點符號。例如品牌和公司名稱。渲染器試圖通過查看代碼點來猜測合適的渲染順序,拉丁字符集中的字符顯然必須從左向右渲染。

但它在標點符號上摸索,括號是最明顯的。您必須清楚地瞭解它,才能知道該怎麼做,您必須在C#代碼中使用Unicode從右到左的標記U+200F\u200f。相反,如果您知道您需要LTR渲染,請使用從左到右的標記,U+200E

+0

關閉後從右向左放置將解決此特定輸出問題,但如果可以,則必須將正確的方向值應用於控件。 –

+0

我試過了,它工作。謝謝! – daniely

0

使用AppendFormat,而不是僅僅Append

stringBuilder.AppendFormat("({0}) {0}", text) 

可以解決這個問題,但它可能 - 你需要看看text價值 - 它可能已經嵌入了LTR/RTL標記字符。這些值需要被刪除或更正。

+0

你的答案的後半部分對於(LTR/RTL標記)是正確的,即如果'AppendFormat'本質上是'Append(string.Format(「{0}」,text))'(我測試過'Append(string。格式(「」))') – LukeHennerley

+0

@LukeHennerley - 基本上就是這樣 - 比OP所做的更多的是比多個附加方便。 – Oded

0

我有一個類似的問題,我設法解決它通過創建一個函數,檢查Unicode中的每個字符。如果它來自FE頁面,那麼我在它後面添加202C,如下所示。沒有這個,就會得到我想要的RTL和LTF混合。

string us = string.Format("\uFE9E\u202C\uFE98\u202C\uFEB8\u202C\uFEC6\u202C\uFEEB\u202C\u0020\u0660\u0662\u0664\u0668 Aa1"); 
相關問題