我使用一个StringBuilder在C#中追加一些文本,可英语(从左到右)或阿拉伯语(从右到左)
stringBuilder.Append("(");
stringBuilder.Append(text);
stringBuilder.Append(") ");
stringBuilder.Append(text);
如果文本= “A”,则输出为 “(A)”
但是,如果文本= “بتث”,则输出为 “(بتث)بتث”
有任何想法吗?
我使用一个StringBuilder在C#中追加一些文本,可英语(从左到右)或阿拉伯语(从右到左)
stringBuilder.Append("(");
stringBuilder.Append(text);
stringBuilder.Append(") ");
stringBuilder.Append(text);
如果文本= “A”,则输出为 “(A)”
但是,如果文本= “بتث”,则输出为 “(بتث)بتث”
有任何想法吗?
这是Windows的文本渲染引擎著名的漏洞时,要求呈现右至左文本,阿拉伯语或希伯来语。 它有一个难以解决的问题,人们往往回落到西方字和标点符号时存在语言的版本没有很好的替代词。 品牌和公司名称的例子。 该渲染器试图通过看代码点,在拉丁字符集显然具有要呈现的左到右的字符在恰当的渲染来猜测。
但是,在摸索标点符号,用方括号是最明显的。 你必须明确这个问题,因此它知道该怎么做,你必须使用Unicode右至左符号, U+200F
或\u200f
在C#代码。 相反,使用左至右符号,如果你知道你需要LTR渲染, U+200E
。
使用AppendFormat
而不只是Append
:
stringBuilder.AppendFormat("({0}) {0}", text)
这可能会解决问题,但它可能-你需要看text
价值-它可能有嵌入式LTR / RTL标记字符。 这些需要或者被去除或在值校正。
我有一个类似的问题,我设法通过创建检查中的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");