Dot-Net

Encoding.Default 與 File.ReadAllText 中沒有編碼不一樣?

  • September 14, 2012

(對不起,如果這是一個騙局)

我剛剛花了很長時間嘗試正確讀取文本文件。

從一開始就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

引用自:https://stackoverflow.com/questions/1305401