不正确的权利从左到右串联英语和阿拉伯语

时间:2016-08-25 13:20:21

标签: c#

我正在尝试将英文字符串与阿拉伯字符串连接起来

string followUpFormula = "FIF";
string renewAbbreviation =  "ع.ت" ;
string abbreviation = followUpFormula +"-"+ renewAbbreviation;
var result = 10 + "/" + abbreviation + "/" + 2016;

结果是10 / FIF-ع.ت/ 2016 但我想像这样显示它们:10 / FIF-ع.ت/
2016

我该怎么做? 感谢

2 个答案:

答案 0 :(得分:5)

您的代码添加了几个

string followUpFormula = "FIF";
string renewAbbreviation =  "ع.ت" ;
string abbreviation = followUpFormula +"-"+ renewAbbreviation;
var lefttoright = ((Char)0x200E).ToString();
var result = 10 + "/" + abbreviation + lefttoright + "/" + 2016;

字符0x200E是一个特殊字符,它告诉以下文本从左到右阅读see here以获取有关该字符的更多信息。

Char 0x200F切换为从右到左的格式。

答案 1 :(得分:3)

这与unicode进程规则混合LTR和RTL文本的方式有关。您可以通过显式使用指示直接嵌入RTL或LTR文本的特殊字符来覆盖默认行为:

private const char LTR_EMBED = '\u202A';
private const char POP_DIRECTIONAL = '\u202C';
private string ForceLTR(string inputStr)
{
    return LTR_EMBED + inputStr + POP_DIRECTIONAL;
}

private void Form1_Load(object sender, EventArgs e)
{
    string followUpFormula = "FIF";
    string renewAbbreviation = "ع.ت";
    string abbreviation = ForceLTR(followUpFormula + "-" + renewAbbreviation);
    textBox1.Text = 10 + "/" + abbreviation + "/" + 2016;
}

这会在字符串前面放置一个嵌入的从左到右的字符(U + 202A),然后使用Pop-Directional-Formatting(U + 202C)字符。后者删除嵌入式方向格式化提示,并将文本方向返回到前一个上下文中的任何内容。因此,返回的字符串可以安全地用于RTL或LTR上下文。

在各种上下文中解析LTR和RTL文本的规则是广泛而复杂的。作为参考,您可以找到bidirectional algorithm specification here。某些字符在对LTR或RTL上下文的亲和性方面被分类为“弱”或“强”。 /-之类的内容很弱,因此在混合它们时,您必须明确说明您希望这些字符尊重哪个文字方向和布局。