为什么TextReader.Read返回一个int而不是一个char?

时间:2013-09-19 00:30:26

标签: c# unicode character-encoding textreader

考虑以下代码(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个字节的值?

2 个答案:

答案 0 :(得分:4)

TextReader.Read()永远不会读取超过2个字节;但是,它返回-1表示“不再需要读取字符”(字符串结尾)。因此,其返回类型需要从Int32(2个字节)增加到Char(4个字节)才能表达完整的Char范围加上-1。< / p>

答案 1 :(得分:1)

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

  

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

并且Length2,因为String是UTF-16序列,需要surrogate pairs来表示U+FFFF以上的代码点。

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

您可以使用Char.ConvertToUtf32()

从中获取UTF-32代码点
Char.ConvertToUtf32("", 0).ToString("X").Dump(); // 24B62