假设我有一个RTL语言(例如阿拉伯语)的字符串,加上一些英语:string s = "Test:لطيفة;اليوم;a;b"
请注意,字符串中包含分号。当我使用string[] spl = s.Split(';');
之类的Split命令时,某些字符串将以相反的顺序保存。这是发生了什么:
spl [0] =“测试:لطيفة”
spl [1] =“”اليوم
spl [2] =“一个”
spl [3] =“ b”
与原始版本相比,以上内容是混乱的。相反,我希望得到这个:
spl [0] =“测试:اليوم”
spl [1] =“لطيفة”
spl [2] =“一个”
spl [3] =“ b”
我准备编写自己的split函数。但是,字符串中的字符也以相反的顺序进行解析,因此我回到第一位。我只想浏览屏幕上显示的每个字符。
最佳答案
按照您当前的字符串显示,单词لطيفة会存储在单词اليوم之前。 اليوم显示为“第一”(也就是说,位于左侧)的事实,只是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(';');
}