2014-09-29 16 views
9

我有一個內容「測試」的文本文件(UTF-8編碼)。我嘗試從該文件獲取字節數組並轉換爲字符串,但它包含一個奇怪的字符。我使用下面的代碼:爲什麼File.ReadAllBytes結果與使用File.ReadAllText不同?

var path = @"C:\Users\Tester\Desktop\test\test.txt"; // UTF-8 

var bytes = File.ReadAllBytes(path); 
var contents1 = Encoding.UTF8.GetString(bytes); 

var contents2 = File.ReadAllText(path); 

Console.WriteLine(contents1); // result is "?test" 
Console.WriteLine(contents2); // result is "test" 

conents1不同於contents2 - 爲什麼?

回答

2

這是UTF8編碼的前綴字符串。它將該文件標記爲UTF8編碼。 ReadAllText不返回它,因爲它是解析指令。

5

ReadAllText's documentation解釋:

該方法嘗試自動檢測一個文件的基於字節順序標記的存在的編碼。編碼格式UTF-8和UTF-32(包括big-endian和little-endian)都可以被檢測到。

因此該文件包含BOM(Byte order mark),並ReadAllText方法正確地解釋它,而第一種方法只是簡單的讀取字節,而不用解釋它們。

Encoding.GetString說,它僅:

所有指定的字節數組中的字節解碼爲字符串

(重點煤礦)。這當然不完全確定,但你的例子表明這是從字面上理解的。

4

您可能在文件的開頭看到Unicode BOM(字節順序標記)。 File.ReadAllText知道如何去掉這個,但Encoding.UTF8沒有。

+0

如果你檢查第一個字符'(int)contents1 [0]',你會看到這個char是BOM字符。更多信息:http://stackoverflow.com/questions/6784799/what-is-this-char-65279 – kpull1 2014-09-29 14:37:08

相關問題