从右到左的语言括号翻转

7

我正在使用C#中的StringBuilder来添加一些文本,这些文本可以是英语(从左到右)或阿拉伯语(从右到左)。

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

如果文本 = “A”,那么输出为“(A) A”。
但是如果文本 = “بتث”,那么输出为“(بتث) بتث”。
有什么想法吗?

2
99.999% 的情况下,问题并不在代码上,而是在你选择的输出方式上。你在哪里看到这个输出?对于 UI 来说,支持双向输出非常复杂,即使是 Gmail 在这方面仍然存在重大问题。 - Shadow The Spring Wizard
3个回答

9
这是Windows文本渲染引擎在渲染从右到左的文字(如阿拉伯语或希伯来语)时已知的缺陷。解决这个难题非常困难,因为当一个语言没有更好的替代词时,人们通常会回归使用西方单词和标点符号,例如品牌和公司名称。该渲染器尝试通过查看代码点猜测正确的渲染顺序,其中拉丁字符集中的字符必须明确从左到右渲染。
但它在处理标点符号时容易出错,括号最为明显。您必须显式地告诉文本渲染引擎该如何渲染文本,您必须使用Unicode从右到左的标记U+200F\u200f在C#代码中。相反,如果您知道需要从左到右呈现,则使用从左到右的标记U+200E

将从右到左的文本放在结束标记后面可以解决这个特定的输出问题,但如果可能的话,您应该将正确的方向值应用于您的控件。 - Amir E. Aharoni

1
使用AppendFormat代替仅使用Append:
stringBuilder.AppendFormat("({0}) {0}", text)

这可能会解决问题,但你需要查看“text”值——它很可能嵌入了LTR / RTL标记字符。这些字符需要被删除或更正。

你的回答后半部分关于(LTR/RTL标记)是正确的,也就是说如果AppendFormat本质上是Append(string.Format("{0}", text))(我测试过Append(string.Format("")))。 - LukeHennerley
@LukeHennerley - 实际上就是这样 - 只不过比起 OP 所做的多次追加更方便。 - Oded

0

我曾经遇到类似的问题,通过创建一个函数来检查 Unicode 中的每个字符,最终成功解决了。如果它是FE页中的字符,那么我会在其后添加202C。否则,我的预期是从右到左,但结果变成了混合的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接