2009-08-20 7 views
10

(Entschuldigung, wenn dies ein Betrogener ist)Encoding.Default ist nicht das gleiche wie keine Codierung in File.ReadAllText?

Ich habe gerade eine lange Zeit damit verbracht, eine Textdatei korrekt zu lesen.

Nachdem mit File.ReadAllText(path) gestartet und verkorksten Zeichen bekommen, habe ich versucht, mehrere Varianten von File.ReadAlltext(path, Encoding) nach dem ich habe versucht, verzettelte meine Eingabedateien zu analysieren um herauszufinden, welches Byte war das Problem, usw.

In ihrer Verzweiflung Ich habe versucht File.ReadAllText(path, Encoding.Default), die funktionierte!

Ich kämpfe jetzt zu verstehen, warum der Standardwert, wenn Sie es angeben, scheinbar nur der Standardwert ist.

(My Cut-down-Testzeichenfolge war +4433ç, sparte ich es im Notizblock als ANSI - wenn auch mit Schweizer Französisch regionalen Einstellungen ...)

+2

Beachten Sie, dass Encoding.Default nicht als "Standard" -Encodierung betrachtet werden sollte - es ist die (nicht Unicode!) Codierung für die Standard * Codepage * des Systems. –

Antwort

10

Encoding.Default der ANSI-Codepage des Systems ist.

Was File.ReadAllText tut, wenn Sie keine Kodierung angeben, ist dies:

  • Zunächst überprüft er, ob es ein Bytereihenfolgemarkierung (UTF-8, UTF-16 oder UTF-32). Wenn dies der Fall ist, wird die Codierung verwendet, die in der Byte-Reihenfolge angegeben ist.
  • Andernfalls wird UTF-8 verwendet.

So ist die einzige Art und Weise des Systems ANSI-Codepage zu erhalten, ist ausdrücklich Encoding.Default angeben.

+0

File.ReadAllText prüft nicht auf Byte-Reihenfolgezeichen. Es wird immer UTF-8 verwendet, wenn Sie keine Kodierung angeben. Dies wird sowohl von Reflector als auch von der .NET-Referenzquelle bestätigt. –

+4

Jivko, ich glaube nicht, dass dein Kommentar korrekt ist. ReadAllText ohne eine Codierung ruft ReadAllText (path, Encoding.UTF8) auf, aber der von ReadAllText verwendete interne Stream liest die BOM, falls vorhanden, und ersetzt die Encoding.UTF8 durch die erkannte Codierung. Dies liegt daran, dass detectEncodingFromByteOrderMarks im StreamReader-Konstruktor auf "true" gesetzt ist. –

2

Von MSDN, um die Zeichenfolge ReadAllText (string path) Überlastung:

Diese Methode versucht automatisch, die Codierung einer

Datei zu erfassen

So Nein, es ist nicht das gleiche wie mit die Standard-Codierung

3

UTF8 ist der eigentliche Standard, und es wird nur verwendet, wenn die automatische Erkennung jede Codierung nicht gefunden haben. Also ist die Stückliste wichtiger. Details siehe unten:

ReadAllText(string path) - MSDN: "Diese Methode versucht automatisch, die Codierung zu erkennen"

ReadAllText(string path, Encoding encoding) - MSDN: "Diese Methode versucht automatisch, die Codierung zu erkennen"

Von Reflector-Tool: ReadAllText(path) ist das gleiche wie ReadAllText(path, Encoding.UTF8), denn ReadAllText(path) ruft gerade ReadAllText(path, Encoding.UTF8). Beide Methoden schafft Stream auf diese Weise:

public StreamReader(string path, Encoding encoding) : this(path, encoding, true, 0x400) 
{ 
} 

Das bedeutet, dass es StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize) mit detectEncodingFromByteOrderMarks auf true gesetzt schafft. Dies bedeutet, dass wenn die Byte Order Mark (BOM) vorhanden ist, wird die Codierung aus der Stückliste verwendet. Wenn BOM nicht vorhanden ist, wird die angegebene Codierung verwendet. Wenn BOM nicht vorhanden ist und keine Codierung bereitgestellt wird, wird UTF8 verwendet. So ist die UTF8 der echte Standard in diesem Fall, aber denken Sie daran, dass Stückliste wichtiger ist als vorgeschlagene Codierung.

+0

Wissen Sie, ob es eine Möglichkeit gibt, die Stückliste zu überschreiben, so dass das Encoding.was immer die Priorität wird? –

+0

@DanW, können Sie versuchen, 'new StreamReader (" brokenFile.txt ", Encoding.whatever, false)'. Aber in diesem Fall wird die Stückliste wahrscheinlich als Text behandelt - Sie werden also am Anfang seltsame Zeichen erhalten. Achten Sie darauf, was Sie tun, denn wenn BOM gesetzt ist, wird es normalerweise korrekt eingestellt. – CoperNick

Verwandte Themen