【问题标题】:Why does TextReader.Read return an int, not a char?为什么 TextReader.Read 返回一个 int,而不是一个 char?
【发布时间】:2013-09-23 22:28:32
【问题描述】:

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

【问题讨论】:

  • 首先,Read()虚拟的StringReader 覆盖它。为什么返回int?不确定..但至少最后一次调用Read() 将允许它确定EOF。此外,它还通过内部字符串索引器 ([]) 方法将 char 转换为 int

标签: c# unicode character-encoding textreader


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    而且,Length2,因为 Strings 是 UTF-16 序列,它要求 surrogate pairs 表示高于 U+FFFF 的代码点。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2013-06-09
      • 2011-09-23
      • 2012-07-13
      • 1970-01-01
      相关资源
      最近更新 更多