为什么 TextReader.Read 返回一个 int,而不是一个字符

本文关键字:一个 字符 int Read 为什么 TextReader 返回 | 更新日期: 2023-09-27 18:31:48

请考虑以下代码(LinqPad 中的.Dump()只是写入控制台):

var s = "  "; //3 byte code point. 4 byte UTF32 encoded
s.Dump();
s.Length.Dump(); // 2
TextReader sr = new StringReader("  ");
int i;
while((i = sr.Read()) >= 0)
{
    // notice here we are yielded two
    // 2 byte values, but as ints
    i.ToString("X").Dump(); // D852, DF62
}

鉴于上述结果,为什么TextReader.Read()返回int而不是char。在什么情况下,它可能会读取大于 2 个字节的值?

为什么 TextReader.Read 返回一个 int,而不是一个字符

TextReader.Read()永远不会读取超过 2 个字节;但是,它返回 -1 表示"没有更多的字符要读取"(字符串末尾)。因此,它的返回类型需要从Char(2个字节)上升到Int32(4个字节),才能表示完整的Char范围加上-1

TextReader.Read()可能使用int来允许在到达文本末尾时返回-1

文本读取器中的下一个字符,如果没有更多字符可用,则为 -1。默认实现返回 -1。

而且,Length2的,因为String是 UTF-16 序列,需要代理项对来表示高于 U+FFFF 的代码点。

{ 0xD852, 0xDF62 } <=> U+24B62 (  )

您可以使用以下Char.ConvertToUtf32()从他们那里获取 UTF-32 码位:

Char.ConvertToUtf32("  ", 0).ToString("X").Dump(); // 24B62