3

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

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()返回 anint而不是 a char。在什么情况下它可能读取大于 2 个字节的值?

4

2 回答 2

4

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

于 2013-09-19T00:48:30.600 回答
1

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

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

而且,这Length2因为Strings 是 UTF-16 序列,它需要代理对来表示上面的代码点U+FFFF

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

您可以通过以下方式从他们那里获取 UTF-32 代码点Char.ConvertToUtf32()

Char.ConvertToUtf32("", 0).ToString("X").Dump(); // 24B62
于 2013-09-19T00:50:04.173 回答