Kodierung mit File.ReadAllLines?
-
Hi und frohes Neues!
Ich lese mit File.ReadAllLines alle Zeilen einer Datei ein. Doch wie finde ich nun raus welcher Zeichensatz die Datei hatte? Es gibt eine überladene Version dieser Methode wo ich Encoding angeben kann, jedoch bekomme ich da nicht die Kodierung zurück, die die Datei benutzt.
Hat da jemand eine Idee, oder muss ich sogar einen StreamReader benutzen um die Kodierung, der Datei, zu bekommen?
Danke euch im voraus!
Lieben Gruß,
Coder2
-
Lässt sich die Kodierung der Datei überhaupt ermitteln ?
Woran wird denn klar, ob es ASCII ist, eine UTF Variante oder vllt. doch nur ein Binärfile ?
-
Ist die Frage ernst gemeint? Man erkennt solche Dateien generell am BOM. -.-
Es ist ne Textdatei die ich mit Notepad als UTF-8 gespeichert habe. Wenn ich mit StreamReader dran gehe, kann ich ja Encoding einfach auslesen. Aber ich möchte gerne keinen StreamReader benutzen.
-
Ja, die Frage war ernst gemeint und BOM sagt mir bis dato nichts. (Werd gleich mal Google bemühen).
Ich kann Dir zwar leider keine Hilfestellung geben, dafür hab ich gleich was neues gelernt. (Aufgrund der vielen Programmierungen für einfache Geräte bin ich mit dem Problem noch nicht in berührung gekommen.)
thx!
-
BOM = Byte Order Mark.
p.s.: Ich bitte darum, das mir jemand hilft der schon etwas von der Thematik mehr versteht als ein Novize.
-
Hat da jemand eine Idee, oder muss ich sogar einen StreamReader benutzen um die Kodierung, der Datei, zu bekommen?
Du kannst Dir zumindest von dem Novizen sagen lassen, das sich im Netz eine menge Beispiele dafür - sogar für C# - finden lassen. Mir sind beim suchen nach BOM und File encoding gleich 5 Stück in die Hände gefallen ^^
-
So? Dann poste doch mal die Links, wenn darin nicht mit StreamReader gearbeitet wird.
-
Coder2 schrieb:
p.s.: Ich bitte darum, das mir jemand hilft der schon etwas von der Thematik mehr versteht als ein Novize.
Als Nicht-Novize kann ich nur soviel sagen: Die Codierung einer Datei ist *nicht* verlässlich erkennbar. Ein BOM muss nämlich keinesfalls vorhanden sein und dann heißt es Raten.
In jedem Fall gilt: die 'File.ReadAllLines'-Methode benutzt stets die Standard- bzw. die explizit übergebene Codierung. Wenn Du das BOM mit einbeziehen willst, musst Du wohl oder übel einen StreamReader verwenden.
– Allerdings sehe ich das Problem nicht, denn der entsprechende Code ist auch nur zwei Zeilen lang, also unwesentlich länger.
static string[] ReadLinesWithBom(string file) { using (System.IO.StreamReader sr = new System.IO.StreamReader(file, true)) return sr.ReadToEnd().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); }
-
@Konrad Rudolph
Danke für die Hilfe. Die Standardkodierung ist die vom System oder die von .NET UTF-8?Gibt mir die ReadLinesWithBom-Methode einen String in der richtigen Kodierung wieder? Und was ist wenn ich den String mit File.WriteAllLines schreibe, wird dort automatisch die Kodierung des Strings genommen, oder wieder eine Standardkodierung?
Dann noch die Sache mit dem Split: Was passiert mit Texten, wo nur \n ist, wird das dann auch funktionieren?
Danke nochmals für die Hilfe
-
msdn: File.ReadAllLines schrieb:
This method attempts to automatically detect the encoding of a file based on the presence of byte order marks. Encoding formats UTF-8 and UTF-32 (both big-endian and little-endian) can be detected.
msdn: File.WriteAllLines schrieb:
The default behavior of the WriteAllLines method is to write out data using UTF-8 encoding without a byte order mark (BOM). If it is necessary to include a UTF-8 identifier, such as a byte order mark, at the beginning of a file, use the WriteAllLines(String, array<String>[](), Encoding) method overload with UTF8 encoding.
Generell scheint .NET immer UTF8 zu nehmen, sofern man nicht nen Encoding angibt.
-
Die anderen Fragen hast Du Dir ja schon selbst beantwortet (das .NET-Verhalten scheint buggy zu sein?).
Coder2 schrieb:
Dann noch die Sache mit dem Split: Was passiert mit Texten, wo nur \n ist, wird das dann auch funktionieren?
Ja. Das char-Array sorgt dafür, dass jeder der dort angegebenen Chars ein mögliches Split-Zeichen ist (d.h. sowohl Unix-, als auch Windows- und Mac-Style-Zeilenumbrüche werden erkannt). Dadurch würden natürlich für einen Windows-Zeilenumbruch (\r\n) ein leerer Eintrag erzeugt, der aber durch den letzten Parameter des Aufrufs entfernt wird.