在 C# 中的字符串的开头和结尾嵌入空字符 (\u0000)

Embedded null char(\u0000) at the beginning and end of a String in C#

我有这段代码,我使用当前文化和序数字符串比较类型输出以下四个字符。

string str4 = "one two three";

Console.WriteLine(str4.IndexOf('\u0000', StringComparison.CurrentCulture));
Console.WriteLine(str4.IndexOf('o', StringComparison.CurrentCulture));
Console.WriteLine(str4.LastIndexOf("\u0000", StringComparison.CurrentCulture));
Console.WriteLine(str4.LastIndexOf("e", StringComparison.CurrentCulture));

Console.WriteLine();

Console.WriteLine(str4.IndexOf('\u0000', StringComparison.Ordinal));
Console.WriteLine(str4.IndexOf('o', StringComparison.Ordinal));
Console.WriteLine(str4.LastIndexOf("\u0000", StringComparison.Ordinal));
Console.WriteLine(str4.LastIndexOf("e", StringComparison.Ordinal));

从输出中我可以看到该字符串在位置 0 处有一个嵌入的空字符和一个 'o' 位置 0 的 char 以及使用当前文化,这怎么可能?

然后在位置 13(但字符串只有 12 个位置(0 到 12))使用当前文化有一个嵌入的空字符,这是如何工作的?

然后当我使用 Ordinal

输出显示在字符串的开头或结尾没有嵌入空字符作为方法 returns -1。

这是否意味着当前区域性会看到嵌入的空字符而序数不会?

当前输出如下:

0
0
13
12

-1
0
-1
12

来自 IndexOf 的文档:

”字符集包括可忽略的字符,这些字符是在执行语言或 culture-sensitive 比较时不考虑的字符。在 culture-sensitive 搜索中(即,如果 comparisonType 不是 Ordinal 或 OrdinalIgnoreCase ), 如果 value 包含一个可忽略的字符,则结果等同于删除该字符进行搜索。如果 value 仅包含一个或多个可忽略的字符,则 IndexOf(String, Int32, Int32, StringComparison) 方法始终 returns startIndex , 这是搜索开始的字符位置。"

零必须是可忽略的字符,因此返回 startIndex。