StreamReader und Encoding - Problem.



  • Hi,

    ich lese so eine Datei ein:

    Encoding encoding = Encoding.ASCII;
    
    using (StreamReader input = new StreamReader ("test_ansi.txt", true))
    {
        encoding = input.CurrentEncoding;
    
        // [...]
    }
    

    Die Datei ist gespeichert als ANSI. Doch ich bekomme als CurrentEncoding "UTF8" zurück, was absolut nicht stimmt.

    Wie kann ich die richtige Kodierung der Datei rausfinden? Was ggf. auch noch gut wäre zu wissen ob es sich um eine Text-Datei handelt oder um eine Binärdatei. 🙂

    Danke euch alle schon mal und ein frohes Fest :xmas1:



  • So sollte es funktionieren:

    Encoding encoding = Encoding.Default;
    string text;
    
    using (StreamReader input = new StreamReader("test_ansi.txt", encoding))
    {
      text = input.ReadToEnd();
      encoding = input.CurrentEncoding;
    }
    
    Debug.Print(text);
    

    Erklärung: Du verwendest im Konstruktor des StreamReaders als zweiten Parameter detectEncodingFromByteOrderMarks, den Du auf true setzt. Die gelesene Datei enthält jedoch keinen BOM-Marker! Darum gibt CurrentEncoding auch UTF8 zurück und die Sonderzeichen (äöü usw.) werden nicht korrekt dargestellt.

    Encoding.Default ruft die Codierung für die aktuelle ANSI-Codepage des Systems ab. Der StreamReader verwendet standardmäßig UTF8.



  • Danke maro!

    Aber ich finds schon etwas doof, dass ich erst den Text einlesen muss, bevor ich weiß was es für ein Format ist, aber das ist nicht schlimm 🙂

    Noch ne Frage: Wie kann ich rausfinden, ob es sich um eine Textdatei handelt, oder um eine Binärdatei (z. B. Bitmap, Exe, Zip usw.)?



  • Streamer schrieb:

    Aber ich finds schon etwas doof, dass ich erst den Text einlesen muss, bevor ich weiß was es für ein Format ist, aber das ist nicht schlimm 🙂

    Eigentlich gibt es garkeine Möglichkeit, das Encoding festzustellen, wenn die Datei kein BOM und keine sonstigen Formatangaben hat. Denn woher soll das Framework bitte wissen, ob eine binäre 163 ein Pfundsymbol in Latin-1 oder ein lappisches G in Latin-6 darstellt?

    Deshalb kann man die Codierung ja auch beim Öffnen schon angeben 😉

    EDIT:
    Für die zweite Frage gilt im Grunde dasselbe. Du kannst höchstens schauen, ob in der Datei nicht darstellbare Zeichen (< 32) enthalten sind. Aber es kann durchaus auch Binärdateien geben, die nur darstellbare Zeichen enthalten, oder Textdateien wo sich mal ein Binärwert zwischenmogelt (z.B. bei Logausgaben).


Anmelden zum Antworten