假设我有一个RTL语言的字符串,例如阿拉伯语,其中包含一些英语:
string s = "Test:لطيفة;اليوم;a;b"
请注意字符串中有分号。当我使用像string[] spl = s.Split(';');
这样的Split命令时,某些字符串会以相反的顺序保存。这就是:
spl [0] =“测试:لطيفة”
spl [1] =“”اليوم
spl [2] =“a”
spl [3] =“b”
与原版相比,上述内容无序。相反,我希望得到这个:
spl [0] =“测试:اليوم”
spl [1] =“لطيفة”
spl [2] =“a”
spl [3] =“b”
我准备编写自己的分割功能。但是,字符串中的字符也以相反的顺序解析,所以我回到原点。我只想浏览屏幕上显示的每个角色。
答案 0 :(得分:12)
正如您的字符串所示,单词لطيفة存储在单词اليوم之前; اليوم显示为“第一个”(即左侧)的事实只是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(';');
}
答案 1 :(得分:2)
您还可以使用Microsoft的Uniscribe库。 ScriptItemize方法将为您提供字符簇,它们在原始字符串中的起始索引和RTL顺序。使用此信息,您可以找到仅包含阿拉伯语的连续群集。将它们拆分为';'并扭转方向将为您提供所需。
答案 2 :(得分:1)
它们的字符串不会被反转,但实际上是以正确的顺序拆分。 RTL语言在显示时是RTL,但在内存中它们像英语一样“从左到右”。我会尝试演示,因为我没有安装阿拉伯语键盘,所以有点难。
您的字符串为s = "Arbi/Arbi, Alarbia"
。 s [0]是A(阿拉伯语A'in),s [1]是R,依此类推。 s [4]是/,s [9]是,。所以当分裂时,你会在第一部分得到s [0:8]而在第二部分得到s [10:]。
这是处理RTL字符串的正确方法。如果你想反过来,你需要自己反转阵列。
请记住,在RTL和LTR之间切换是最令人沮丧的任务之一。你不知道你需要花多长时间来弄清楚如何处理RTL字符串中的数字或英文单词。你可以做的最好的事情是完全避免这个问题,并尝试让Excel将字符串显示为RTL。
答案 3 :(得分:0)
看起来(根据Reflector)Split
内部使用Substring
并使用内部函数,只是从左到右复制字母而不考虑文化。因此,我没有看到任何方法只是反转Split
返回的数组。