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

时间:2015-04-15 22:21:06

标签: c# .net unicode

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

示例代码:

string test = "abce\u0308fgh";
Console.WriteLine(test.IndexOf("e"));
Console.WriteLine(test.IndexOf("ë"));

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

string test = "abcde\u0308fgh";
Console.WriteLine(test.Split('e').Length.ToString());
Console.WriteLine(test.Split('ë').Length.ToString());

出于某种原因,Split()不会将变音符号组合在一起,而是会被e分割,而不会被ë分开。

这个功能是否有某种原因并且有没有办法让IndexOf()函数不结合变音符号,或者最好是Split()函数呢?

编辑:注意到我之前写错了代码,它有'e'而不是“e”

string test = "abce\u0308fgh";
Console.WriteLine(test.IndexOf('e'));
Console.WriteLine(test.IndexOf('ë'));

这也表现为Split(),因此它不在方法之间,而是在获取字符或字符串之间。

1 个答案:

答案 0 :(得分:1)

实际上,当我将示例代码复制并粘贴到空白程序中时,我得到了我可能期望的行为:IndexOf()Split()都不会将组合字符视为传入{ {1}}搜索字符。即对ë的调用会为我返回-1,与您描述IndexOf('ë')行为的方式一致。

也就是说,如果您希望Split()将单字符版本的这种双字符表示视为最初的单字符版本,您可以在Split()之前调用string.Normalize() {1}}。例如:

Split()

Console.WriteLine(test.Normalize().Split('ë').Length); 方法有一个过载,让您可以控制标准化的确切类型,如果需要的话(它不在您提供的示例中)。