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)??
在哪里答案 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 - 在你的第二种情况下,最后一个字符缺失,因为单独的前缀不会解析为字符。框架需要一个连续字节来确定有效的代码点,但遇到流结束并且不输出任何内容。