Encoding.Default 與 File.ReadAllText 中沒有編碼不一樣?
(對不起,如果這是一個騙局)
我剛剛花了很長時間嘗試正確讀取文本文件。
從一開始就
File.ReadAllText(path)搞砸了字元,我嘗試了幾種變體,File.ReadAlltext(path, Encoding)之後我陷入了試圖分析我的輸入文件以找出問題所在的字節等。在絕望中我嘗試
File.ReadAllText(path, Encoding.Default)了,它奏效了!我現在很難理解為什麼預設值顯然只是您指定的預設值。
(我刪減的測試字元串是
+4433ç,我將它作為 ANSI 保存在記事本中 - 儘管使用的是瑞士法語區域設置…)
Encoding.Default 是系統的 ANSI 程式碼頁。
如果您不指定編碼,File.ReadAllText 會執行以下操作:
- 首先它檢查是否有字節順序標記(UTF-8、UTF-16 或 UTF-32)。如果有,則使用字節順序標記中指定的編碼。
- 否則,它使用 UTF-8。
因此,獲取系統的 ANSI 程式碼頁的唯一方法是顯式指定 Encoding.Default。
UTF8 是真正的預設值,僅在自動檢測未找到任何編碼時使用。所以BOM更重要。請參閱下面的詳細資訊:
ReadAllText(string path)- MSDN:“此方法嘗試自動檢測編碼”
ReadAllText(string path, Encoding encoding)- MSDN:“此方法嘗試自動檢測編碼”From Reflector tool:
ReadAllText(path)和 一樣ReadAllText(path, Encoding.UTF8),因為ReadAllText(path)只是呼叫ReadAllText(path, Encoding.UTF8). 兩種方法都以這種方式創建 StreamReader:public StreamReader(string path, Encoding encoding) : this(path, encoding, true, 0x400) { }這意味著它
StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize)在 detectEncodingFromByteOrderMarks 設置為 true 的情況下創建。這意味著如果存在字節順序標記 (BOM),它將使用 BOM 中的編碼,如果 BOM 不存在,則它將使用提供的編碼。如果 BOM 不存在且未提供編碼,則它將使用 UTF8。所以在這種情況下, UTF8是真正的預設值,但請記住,BOM 比建議的編碼更重要。// bom.txt is the file with BOM present. nobom.txt - witout BOM File.ReadAllText("bom.txt"); // use BOM File.ReadAllText("bom.txt", Encoding.UTF8); // use BOM File.ReadAllText("bom.txt", Encoding.Default); // use BOM File.ReadAllText("nobom.txt"); // use UTF-8 File.ReadAllText("nobom.txt", Encoding.UTF8); // use UTF-8 File.ReadAllText("nobom.txt", Encoding.Default); // use system's ANSI codepage