从左到右解析阿拉伯语/ RTL文本

假设我有一个RTL语言的字符串,例如阿拉伯语,其中包含一些英语:

string s = "Test:لطيفة;اليوم;a;b"

请注意,字符串中有分号。 当我使用Split命令时,如string[] spl = s.Split(';'); ,然后一些字符串以相反的顺序保存。 这是发生的事情:

spl [0] =“测试:لطيفة”
spl [1] =“”اليوم
spl [2] =“a”
spl [3] =“b”

与原版相比,上述内容无序。 相反,我希望得到这个:

spl [0] =“测试:اليوم”
spl [1] =“لطيفة”
spl [2] =“a”
spl [3] =“b”

我准备编写自己的分割function。 但是,字符串中的字符也以相反的顺序进行解析,所以我回到原点。 我只想浏览屏幕上显示的每个角色。

正如您的字符串当前所示,单词لطيفة存储在单词اليوم之前; اليوم显示为“第一”(即,在左侧)的事实只是Unicode双向算法在显示文本时的(正确)结果。

那就是:你开始的字符串(“Test:لطيفة;اليوم; a; b”)是用户输入“Test:”,然后是لطيفة,然后是“;”,然后是“اليوم”,然后是“; a; b”。 因此,C#分割它的方式实际上反映了创建字符串的方式。 只是它的创建方式没有反映在字符串的显示中,因为两个连续的阿拉伯语单词在显示时被视为一个单元。

如果你想要一个字符串以从左到右的顺序显示阿拉伯语单词,中间用分号,同时也按照相同的顺序存储单词,那么你应该在之后放置一个从左到右的标记(U + 200E)分号。 这将有效地将每个阿拉伯语单词分割为其自己的单元,然后双向算法将分别处理每个单词。

例如,以下代码以与您使用的字符串相同的字符串开头(添加了单个“从左到右”标记),但它会根据您期望的方式将其拆分(即,spl [0] =“Test:اليوم”,spl [1] =“لطيفة”):

 static void Main(string[] args) { string s = "Test:اليوم;\u200Eلطيفة;a;b"; string[] spl = s.Split(';'); } 

您还可以使用Microsoft的Uniscribe库。 ScriptItemize方法将为您提供字符簇,它们在原始字符串中的起始索引和RTL顺序。 使用此信息,您可以找到仅包含阿拉伯语的连续群集。 将它们拆分为’;’ 并扭转方向将为您提供所需。

它们的字符串不会反转但实际上按正确顺序拆分。 RTL语言在显示时是RTL,但在内存中,它们就像英语一样“从左到右”。 我会尝试演示,因为我没有安装阿拉伯语键盘,所以有点难。

你的字符串是s = "Arbi/Arbi, Alarbia" 。 s [0]是A(阿拉伯语A’in),s [1]是R,依此类推。 s [4]是/,s [9]是,。 因此,当分裂时,你在第一部分得到s [0:8]而在第二部分得到s [10:]。

这是处理RTL字符串的正确方法。 如果你想反过来,你需要自己反转arrays。

请记住,在RTL和LTR之间切换是最令人沮丧的任务之一。 你不知道你要花多长时间来弄清楚如何处理RTL字符串中的数字或英文单词。 您可以做的最好的事情是完全避免这个问题,并尝试让Excel将字符串显示为RTL。

它看起来像(根据Reflector), Split内部使用Substring ,它使用的内部函数只是从左到右复制字母而不考虑文化。 因此,我没有看到任何方法只是反转Split返回的数组。