如果我有一个包含组合变音符号的字符串,则不同字符串函数之间的行为之间似乎存在一些混淆.如果我使用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()也是行为,所以它不在方法之间,而是在获取字符或字符串之间.
实际上,当我将示例代码复制并粘贴到空白程序中时,我得到的行为正是我所期望的:两者IndexOf()都不Split()将组合字符视为传入的\xc3\xab搜索字符。即,对我的调用IndexOf('\xc3\xab')返回 -1,与您描述 的行为一致Split()。
也就是说,如果您想Split()将单字符版本的两个字符表示视为实际上它们最初是单字符版本,则只需调用string.Normalize()before即可Split()。例如:
Console.WriteLine(test.Normalize().Split('\xc3\xab').Length);\nRun Code Online (Sandbox Code Playgroud)\n\n如果需要的话,该Normalize()方法有一个重载,可以让您控制规范化的确切类型(它不在您提供的示例中)。
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |