2010-11-13 58 views
2

我正在阅读一个简单的文本文件,其中包含使用文件流类的单行。但它似乎filestream.read在一开始prepends一些垃圾字符。文件流预读垃圾字符,同时阅读

下面的代码。

using (var _fs = File.Open(_idFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read)) 
{ 
    byte[] b = new byte[_fs.Length]; 
    UTF8Encoding temp = new UTF8Encoding(true); 
    while (_fs.Read(b, 0, b.Length) > 0) 
    { 
     Console.WriteLine(temp.GetString(b)); 
     Console.WriteLine(ASCIIEncoding.ASCII.GetString(b)); 


    } 
} 

例如:我在文本文件中的数据仅仅是“样品”。但上面的代码返回

"?sample" and 
    "???sample" 

是什么原因?它是文件指示符的开始吗?有没有办法只读我的实际内容?

+4

我在文本文件中的数据仅仅是“样品” < - 你肯定没有它的UTF8 BOM盈?用十六进制编辑器检查它。 – CodesInChaos 2010-11-13 10:12:49

+0

@CodeInChaos,感谢提示,在十六进制编辑它看起来“ef bb bf 73 61 6d 70 6c 65 00 and ... sample”。这是为什么..... – RameshVel 2010-11-13 10:15:58

+0

如果你需要去掉BOM,你已经做错了。请参阅http://stackoverflow.com/questions/1317700/strip-byte-order-mark-from-string-in-c。 – 2010-11-13 10:17:42

回答

2

byte order mark(BOM)由Unicode字符0xFEFF组成,用于标记具有用于它的编码的文件。

所以,如果你正确解码文件为UTF8,你会得到该字符作为你的字符串的第一个字符。如果将它错误地解码为ANSI,则会得到3个字符,因为0xFEFF的UTF8编码是3字节的字节序列“EF BB BF”。

但你的整个代码可以

File.ReadAllText(fileName,Encoding.UTF8) 

被替换,并且应该删除BOM过。或者您省略编码参数并让该功能自动检测编码(为此使用BOM)

2

可能是BOM - a.k.a字节顺序标记。

0

您正在读取流中的BOM。如果您正在阅读文字,请尝试使用StreamReader,这将自动处理此问题。

0

尝试,而不是

using (StreamReader sr = new StreamReader(File.Open(path),Encoding.UTF8)) 

必定会剥夺你的BOM