从右到左语言支架反转

时间:2013-01-24 14:29:53

标签: c# right-to-left

我在C#中使用StringBuilder附加一些文本,可以是英文(从左到右)或阿拉伯文(从右到左)

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

如果text =“A”,则输出为“(A)A”

但如果text =“بتث”,则输出为“(بتث)بتث”

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

当要求呈现从右到左文本,阿拉伯语或希伯来语时,这是Windows文本呈现引擎中的一个众所周知的缺陷。它有一个难以解决的问题,当语言中没有可用的替代词时,人们常常会回到西方语言和标点符号。例如品牌和公司名称。渲染器通过查看代码点来尝试猜测正确的渲染顺序,拉丁字符集中的字符显然必须从左到右呈现。

但它在标点符号上摸索,括号最明显。您必须明确它,以便它知道该怎么做,您必须在C#代码中使用Unicode从右到左标记U+200F\u200f。相反,如果您知道需要LTR渲染,请使用从左到右的标记,U+200E

答案 1 :(得分:0)

使用AppendFormat代替Append

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

这个可以解决问题,但可能 - 您需要查看text值 - 它可能嵌入了LTR / RTL标记字符。这些需要在值中删除或更正。

答案 2 :(得分:0)

我遇到了类似的问题,我设法通过创建一个检查Unicode中每个Char的函数来解决它。如果是来自页面FE,那么我在它之后添加202C,如下所示。如果没有这个,它就会让RTL和LTF混合在一起。

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