StreamReader不读取最后一个字符

时间:2017-12-12 14:51:48

标签: c# .net encoding character-encoding

MyFile.txt包含(以十六进制):

40 D8 40

我通过以下方式打印所有字符:

using (StreamReader sr = new StreamReader("MyFile.txt"))
{
    while (!sr.EndOfStream)
    {
         int n = sr.Read();
         Console.WriteLine("{0:X}", n);
    }
}

输出结果为:

40
FFFD
40

但是,当MyFile.txt包含相同的字符时, D8 是最后一个:

40 40 D8

输出仅为:

40
40

最后一个字符 D8 (FFFD)??

在哪里

1 个答案:

答案 0 :(得分:0)

StreamReader期望输入为utf8。除非您指定不同的编码,或者使用二进制FileStream,否则您将在输出中获得表示为0xFF序列的无效代码点。

在您的实际情况中,0xD8是一个有效的Unicode前缀,也就是"平面选择器",但0x40不是一个有效的连续字节,用于形成一个代码点:http://www.fileformat.info/info/unicode/char/d840/index.htm

  

U + D840不是有效的unicode字符。

Related, interesting read - 在你的第二种情况下,最后一个字符缺失,因为单独的前缀不会解析为字符。框架需要一个连续字节来确定有效的代码点,但遇到流结束并且不输出任何内容。