2014-09-22 71 views
0

我有以下的代碼:的StreamReader未能檢測BOM

using (StreamReader sr = new StreamReader(path, Encoding.GetEncoding("shift-jis"), true)) { 
    mCertainFileIsUTFFormat = !sr.CurrentEncoding.Equals(Encoding.GetEncoding("shift-jis")); 
    mCodingFromBOM = sr.CurrentEncoding; 

    String line = sr.ReadToEnd(); 
    return line.Split('\n'); 
} 

基本上讀取文件,並假設移位-JIS如果沒有BOM。唉,無論如何,這種方法總是返回Shift-JIS編碼,即使文件中有一個BOM。我在這裏做錯了什麼,或者有一個已知的問題?我總是可以打開文件的二進制,做好自己的工作,但是這是應該做我想要的東西:)

+0

請確保調用'任何形式的Read' - 它不會檢測到編碼*之前*閱讀。 [CurrentEncoding](http://msdn.microsoft.com/en-us/library/system.io.streamreader.currentencoding%28v=vs.110%29.aspx) - 「在第一次調用之後,值可能不同StreamReader的任何Read方法,因爲編碼自動檢測不會完成,直到第一次調用Read方法。「 – 2014-09-22 23:46:04

+0

嗯。讓我嘗試一下。 :) – 2014-09-22 23:47:10

+0

你先生賺1天的互聯網。做出答案,我會把它解決。 – 2014-09-22 23:48:35

回答

6

你需要調用任何形式的Read - StreamReader之前讀數將無法檢測到編碼。即您ReadToEnd電話後得到的編碼:

String line = sr.ReadToEnd(); 
    mCodingFromBOM = sr.CurrentEncoding; 

信息:StreamReader.CurrentEncoding

值可以是第一次調用StreamReader的任何Read`方法之後不同,因爲編碼自動檢測是不是直到第一個呼叫完成到一個Read方法。