Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从左到右通过阿拉伯语/RTL文本进行解析_C#_String_Unicode_Right To Left - Fatal编程技术网

C# 从左到右通过阿拉伯语/RTL文本进行解析

C# 从左到右通过阿拉伯语/RTL文本进行解析,c#,string,unicode,right-to-left,C#,String,Unicode,Right To Left,假设我有一个RTL语言的字符串,比如阿拉伯语,里面有一些英语: string s=“测试:a;b” 请注意,字符串中有分号。当我使用Split命令时,比如string[]spl=s.Split(“;”),则某些字符串按相反顺序保存。情况就是这样: ‏‏‏‏‏spl[0]=”‏测试:لطيف㶡“ spl[1]=”‏"الوم spl[2]=‏"a“ spl[3]=‏“b” 与原件相比,上述内容不符合要求。相反,我希望得到以下结果: ‏‏spl[0]=‏“测试:测试” spl[1]=”‏لطيفة“

假设我有一个RTL语言的字符串,比如阿拉伯语,里面有一些英语:

string s=“测试: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”


我准备编写自己的分割函数。但是,字符串中的字符也以相反的顺序进行解析,所以我回到了第一步。我只想查看屏幕上显示的每个字符。

根据Reflector的说法,
Split
在内部使用
子字符串,并使用一个内部函数,只从左到右复制字母,而不考虑区域性。正因为如此,我看不到任何方法可以仅仅反转
Split
返回的数组。

它们的字符串不是反转的,而是按正确的顺序实际拆分的。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。

由于您的字符串当前的状态,单词“لففه”存储在单词“الوم”之前;اليوم显示为“第一”(即,更靠左)这一事实只是Unicode双向算法在显示文本时的一个(正确)结果

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

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

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


您还可以使用Microsoft的Uniscribe库。ScriptItemize方法将为您提供字符簇、原始字符串的起始索引和RTL顺序。使用此信息可以找到仅包含阿拉伯语的连续簇。根据“;”拆分它们如果我误解了你的意思,我想反转的不是每个字符串中的内容,而是字符串本身的顺序。不幸的是,我仍然需要LTR解析,以保持与CSV中潜在LTR文本的兼容性。如果您反转字符串本身,您将得到没有任何意义的反转单词。Ibra和Arbi不是一回事,aibrala甚至不是一个词。是的,我不想反转任何字符串本身,只想反转标记的顺序。我已经进一步编辑了我的问题(并缩短了它),所以你可以看到更深层次的问题。让我知道你的想法。感谢您的帮助。您可以将字符串拆分为任何非字母数字字符,然后正确地组合和组织这些部分(如果是逗号,则颠倒顺序,如果不是,则只需组合)。这很难纠正。最好的方法是让用户按正确的顺序键入字符串,以便Excel。不要陷入这样的RTL问题,你会得到一百万个bug。谢谢。当我在CSV中也有使用“正常”LTR格式的文本时,问题就出现了。因此,如果我反转数组,那么包含“正常”文本的字符串的顺序也有可能被反转。我会一个字符一个字符地解析它,但问题也存在,因为文本是用RTL文本从RTL解析的。编辑我的问题以澄清问题。谢谢!现在一切都有意义了。是的,我错误地认为显示器显示的是“正确的”(从我的角度)<代码>\u200e
不会改变它的内部存储方式,只会改变它的显示方式。我保存了看似不正确的CSV(数据出现在错误的列标题下),将其加载到Excel中,每个单元格中的数据都位于正确的标题下!我只需要小心使用
U+200E
char,因为我必须将它限制在RTL char旁边,正如其他地方所说的。我希望Unicode/VS将
\u200E
作为这些情况下的默认样式。
static void Main(string[] args) {
    string s = "Test:اليوم;\u200Eلطيفة;a;b";
    string[] spl = s.Split(';');
}