2014-09-29 8 views
9

Ich habe eine Textdatei (UTF-8-Codierung) mit Inhalt "test". Ich versuche, das Byte-Array aus dieser Datei zu erhalten und in String zu konvertieren, aber es enthält ein seltsames Zeichen. Ich verwende den folgenden Code ein:Warum ist das File.ReadAllBytes-Ergebnis anders als bei der Verwendung von 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 ist anders als contents2 - warum?

Antwort

2

Es ist die UTF8 Codierung Präfix Zeichenfolge. Es markiert die Datei als UTF8-codiert. ReadAllText gibt es nicht zurück, weil es eine Parsing-Anweisung ist.

5

Wie erläutert in ReadAllText's documentation: basierend auf dem Vorhandensein von Markierungen Bytereihenfolge

Dieses Verfahren versucht, die Codierung einer Datei automatisch zu erkennen. Kodierungsformate UTF-8 und UTF-32 (sowohl Big-Endian und Little-Endian) können erkannt werden.

So enthält die Datei BOM (Byte order mark) und ReadAllText Methode es richtig interpretiert, während die erste Methode Ebene Bytes gerade liest, ohne sie überhaupt zu interpretieren.

Encoding.GetString sagt, dass es nur:

alle Bytes in der angegebenen Byte-Array in eine Zeichenkette dekodiert

(emphasis Mine). Das ist natürlich nicht ganz schlüssig, aber Ihr Beispiel zeigt, dass dies wörtlich zu verstehen ist.

4

Sie sehen wahrscheinlich die Unicode-Stückliste (Byte Order Mark) am Anfang der Datei. File.ReadAllText weiß, wie man das abzieht, aber Encoding.UTF8 nicht.

+0

Wenn Sie das erste Zeichen '(int) contents1 [0]' überprüfen, sehen Sie, dass dieses Zeichen das BOM-Zeichen ist. Weitere Informationen: http://stackoverflow.com/questions/6784799/what-is-this-char-65279 – kpull1

Verwandte Themen