假设我有一个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”
解决方法
正如您的字符串当前所示,单词لطيفة存储在单词اليوم之前;事实上,“首先”(即,在左侧)显示的是“双向”算法在显示文本时的正确结果.
也就是说:你开始的字符串(“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(';'); }