String.Split()和String.IndexOf()之间组合变音符号的不同行为

Sam*_*nen 7 .net c# unicode

如果我有一个包含组合变音符号的字符串,则不同字符串函数之间的行为之间似乎存在一些混淆.如果我使用String.IndexOf(),它将结合变音符号并找到正确的字符.如果我使用String.Split(),由于某种原因它不会合并它们,也不会找到组合字符.

示例代码:

string test = "abce\u0308fgh";
Console.WriteLine(test.IndexOf("e"));
Console.WriteLine(test.IndexOf("ë"));
Run Code Online (Sandbox Code Playgroud)

这将按预期工作,这意味着找不到e,但是ë是.但由于某种原因,这种行为并不相似:

string test = "abcde\u0308fgh";
Console.WriteLine(test.Split('e').Length.ToString());
Console.WriteLine(test.Split('ë').Length.ToString());
Run Code Online (Sandbox Code Playgroud)

由于某种原因,Split()不会将变音符号组合并将由e分割,而不是由ë分割.

这个功能是否有某种原因,是否有一种方法可以使一个IndexOf()函数不结合变音符号,或者最好是一个Split()函数呢?

编辑:注意到我之前写过错误的代码,它有'e'而不是"e"

string test = "abce\u0308fgh";
Console.WriteLine(test.IndexOf('e'));
Console.WriteLine(test.IndexOf('ë'));
Run Code Online (Sandbox Code Playgroud)

Split()也是行为,所以它不在方法之间,而是在获取字符或字符串之间.

Pet*_*iho 1

实际上,当我将示例代码复制并粘贴到空白程序中时,我得到的行为正是我所期望的:两者IndexOf()都不Split()将组合字符视为传入的\xc3\xab搜索字符。即,对我的调用IndexOf('\xc3\xab')返回 -1,与您描述 的行为一致Split()

\n\n

也就是说,如果您想Split()将单字符版本的两个字符表示视为实际上它们最初是单字符版本,则只需调用string.Normalize()before即可Split()。例如:

\n\n
Console.WriteLine(test.Normalize().Split('\xc3\xab').Length);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果需要的话,该Normalize()方法有一个重载,可以让您控制规范化的确切类型(它不在您提供的示例中)。

\n