2010-11-13 60 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