我正在使用C#一個StringBuilder追加一些文本,可以是英語(從左到右)或阿拉伯語(從右到左)從右到左語言支架反
stringBuilder.Append("(");
stringBuilder.Append(text);
stringBuilder.Append(") ");
stringBuilder.Append(text);
如果text =「A」 ,則輸出爲 「(A)」
但是,如果文本= 「بتث」,則輸出爲 「(بتث)بتث」
任何想法?
我正在使用C#一個StringBuilder追加一些文本,可以是英語(從左到右)或阿拉伯語(從右到左)從右到左語言支架反
stringBuilder.Append("(");
stringBuilder.Append(text);
stringBuilder.Append(") ");
stringBuilder.Append(text);
如果text =「A」 ,則輸出爲 「(A)」
但是,如果文本= 「بتث」,則輸出爲 「(بتث)بتث」
任何想法?
當被要求呈現從右到左的文本,阿拉伯語或希伯來語時,這是Windows文本呈現引擎中的一個衆所周知的缺陷。這是一個難以解決的問題,當語言中沒有好的替代詞時,人們往往會回到西方的文字和標點符號。例如品牌和公司名稱。渲染器試圖通過查看代碼點來猜測合適的渲染順序,拉丁字符集中的字符顯然必須從左向右渲染。
但它在標點符號上摸索,括號是最明顯的。您必須清楚地瞭解它,才能知道該怎麼做,您必須在C#代碼中使用Unicode從右到左的標記U+200F
或\u200f
。相反,如果您知道您需要LTR渲染,請使用從左到右的標記,U+200E
。
關閉後從右向左放置將解決此特定輸出問題,但如果可以,則必須將正確的方向值應用於控件。 –
我試過了,它工作。謝謝! – daniely
使用AppendFormat
,而不是僅僅Append
:
stringBuilder.AppendFormat("({0}) {0}", text)
這可以解決這個問題,但它可能 - 你需要看看text
價值 - 它可能已經嵌入了LTR/RTL標記字符。這些值需要被刪除或更正。
你的答案的後半部分對於(LTR/RTL標記)是正確的,即如果'AppendFormat'本質上是'Append(string.Format(「{0}」,text))'(我測試過'Append(string。格式(「」))') – LukeHennerley
@LukeHennerley - 基本上就是這樣 - 比OP所做的更多的是比多個附加方便。 – Oded
我有一個類似的問題,我設法解決它通過創建一個函數,檢查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");
99.999%這不是代碼錯誤,而是您選擇的輸出。你看到這個輸出的地方? UI支持這兩個方向非常複雜,直到今天,即使gmail也存在重大問題。 –