Wie finde ich das Encoding

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Wie finde ich das Encoding

    Hi,

    ich habe eine DB2 LUW SQL Abfrage, die in einem DOS Window läuft. Am Ende des Selects wird wie üblich die folgende Meldung ausgegeben:

    10 Satz/Sätze ausgewählt.

    Über eine entsprechende Option des "run" Befehls habe ich die Ausgabe in eine .txt Datei umgeleitet. Auch das sieht ganz manierlich aus.

    Nun Lese ich diese Text Datei, wähle einige Zeilen aus bzw. ab ... und schreibe das Ganze in zweite Text Datei.

    VB.NET-Quellcode

    1. Using sr = New StreamReader(LogObject),
    2. sw = New StreamWriter(LstObject, False)
    3. Dim line As String = sr.ReadLine
    4. sw.WriteLine(line) 'Write log line


    Wie üblich werden dabei die Umlaute verstrubbelt.

    10 Satz/S�tze ausgew�hlt.

    Ich hab deshalb versucht das Encoding zu setzen, etwa:

    sw = New StreamWriter(LstObject, False, System.Text.Encoding.Unicode)

    Klappt nicht!

    Ich habe alle verfügbaren Encodings ausprobiert (ASCII, UTF 8, UTF 16 ... ) ... aber nichts funktioniert.

    Mit einem HexEditor hab ich mir die Quelldatei angeschaut:

    BOM = "", ä=x'E4

    Die Target Datei hingegen hat eine BOM ... und das Zeichen ä besteht aus drei Hexzeichen ... das klingt nach Unicode, aber es klappt halt nicht.

    Gibt es einen Weg die Encodierung der Quelldatei für die Zieldatei zu übernehmen? Oder wie sonst löse ich das Problem?

    LG
    Peter
    So kannst du das Encoding einer Datei auslesen:

    VB.NET-Quellcode

    1. Public Function GetFileEncoding(filePath As String) As Encoding
    2. Using sr As StreamReader = New StreamReader(filePath, True)
    3. sr.Read()
    4. Return sr.CurrentEncoding
    5. End Using
    6. End Function


    Aber mehr Info findest du hier: stackoverflow.com/questions/18…termine-textfile-encoding
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Peter329 schrieb:

    Ich habe alle verfügbaren Encodings ausprobiert
    Oh - da wüsste ich nochn paar (die ich mir mal notiert habe)

    Quellcode

    1. Encoding.Default 'Ansi (CP1252 bei deutschem Windows)
    2. Encoding.GetEncoding(1252) 'Ansi
    3. Encoding.UTF8 'UTF8
    4. Encoding.GetEncoding(65001) 'UTF8
    5. Encoding.Unicode 'UTF16LE
    6. Encoding.GetEncoding(437) 'OEM (DOS) 437
    7. Encoding.ASCII 'Nur 7-Bit Zeichen (bis Zeichen 127)
    Erst mal vielen Dank für deine Antwort.

    Ich hab das wie folgt versucht:

    VB.NET-Quellcode

    1. File.Delete(LstObject)
    2. Debug.Print(GetFileEncoding(LogObject).ToString)
    3. Using sr = New StreamReader(LogObject),
    4. sw = New StreamWriter(LstObject, False, GetFileEncoding(LogObject))


    Die Target Datei habe ich gelöscht, damit nix übernommen werden kann.
    Der Debug.Print liefert: System.Text.UTF8Encoding

    Aber leider ist das Ergebnis unverändert. Der neue File hat eine BOM (x'EF BB FF) und das "ä" wird als x'EF BF BD dargestellt.

    Schade, deine Lösung klang so vielversprechend.
    Mach es einfach. Lad sie in einen Array und ließ diesen aus:

    VB.NET-Quellcode

    1. Dim data() As Byte = File.ReadAllBytes("test.txt")

    Danach ist es automatisch UTF-16, wenn man dem Beitrag glaubt.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gather“ ()

    @EDR

    Wenn ich etwa Encoding.Ansi eingebe, erhalte ich die Meldung Ansi ist kein Member von Encoding. Ich vermute, dass für deine Encodings irgendwelche Imports fehlen.

    @Gather

    Lesen mit ReadAllBytes hilft mir nicht so viel, weil ich aufgrund meiner Programmlogik zeilenweise lesen und schreiben muss ... möglicherweise hab ich nicht verstanden, was du mir raten wolltest ...
    Sieh dir bitte einmal den von mir verlinkten URL an.
    Dieser behandelt genau dein Problem. Außerdem findest du dort eine funktion Welche das Encoding besser erkennt.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Wie immer vielen Dank an die Ratgeber.

    Ich habe versucht, eine Testumgebung aufzubauen, mit der ich mein Problem nachstellen kann.

    Dabei ist mir aufgefallen, dass die Sache mit DB2 LUW überhaupt nichts zu tun hat. Ein mit notepad erstellter File zeigt den gleichen Effekt.

    Dannach ist mir aufgefallen, dass die Sache auch mit dem SCHREIBEN gar nichts zu tun hat. Die Daten werden bereits beim LESEN verstrubbelt.

    Und deshalb ist die Lösung schlicht und ergreifend Encoding.Default beim Lesen mit dem StreamReader zu verwenden.

    Also, Daumen hoch, Problem gelöst! :)

    LG
    Peter