如果我有一个包含组合变音符号的字符串,则不同字符串函数之间的行为之间似乎存在一些混淆。如果我使用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()
,因此它不在方法之间,而是在获取字符或字符串之间。
答案 0 :(得分:1)
实际上,当我将示例代码复制并粘贴到空白程序中时,我得到了我可能期望的行为:IndexOf()
和Split()
都不会将组合字符视为传入{ {1}}搜索字符。即对ë
的调用会为我返回-1,与您描述IndexOf('ë')
行为的方式一致。
也就是说,如果您希望Split()
将单字符版本的这种双字符表示视为最初的单字符版本,您可以在Split()
之前调用string.Normalize()
{1}}。例如:
Split()
Console.WriteLine(test.Normalize().Split('ë').Length);
方法有一个过载,让您可以控制标准化的确切类型,如果需要的话(它不在您提供的示例中)。