Einlesen Chinesischer Schriftzeichen aus Textdateien

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Einlesen Chinesischer Schriftzeichen aus Textdateien

    Hallo zusammen,
    Folgendes Problem
    Ich will chinesische Strings in einer Textdatei finden.

    Wie macht man das richtig? Mit meinen Versuchen komme ich nicht weiter

    Zum HintergrundAus einer selbst erstellten Textdatei (zusammen kopiert) lese ich eine Reihe von Strings, die chinesisch oder englisch sein können.
    Diese Textdatei1 lese ich mit IO.File.ReadAllLines (Pfad).
    Das klappt, hier werden die chinesischen Zeichen übernommen. Diese will ich jetzt in einer zweiten Datei finden.

    Hier fängt mein Problem an
    Die zweite Textdatei stammt aus China und besteht auch aus chinesischen oder englischen Strings.
    Wenn ich hier über IO.File.ReadAllLines(f) einlese, sehen die chinesischen Zeichen z.B. so aus ‚������,
    anstelle 结果表格

    Setze ich IO.File.ReadAllLines(f, Encoding.Default) ein, bekomme ich "½á¹û±í¸ñ
    (Solche Zeichen bekomme ich auch, wenn ich beim Einlesen der ersten Textdatei ein endcoding.default verwende.)

    Versuche ich mit Encoding.Unicode die Datei einzulesen, bekomme ich nur eine Line, die so tut als enthalte sie die Zeichen die ich suche. "﮹" & ChrW(2573) & "剔丠" & ChrW(11855) & …"
    Da ist kein englischer String drin.

    Meine Versuche, zeilenweise zu arbeiten, in dem ich entweder jede Zeile aus dem Array, das entsteht, wenn ich mit readalllines verwende, kommt auf das gleiche hinaus, wenn ich direkt endcoding.default verwende.
    Das habe ich so versucht

    VB.NET-Quellcode

    1. Dim arr = IO.File.ReadAllLines(f, Encoding.Default)
    2. For Each a In arr
    3. Dim defaultCode As Encoding = Encoding.Default
    4. Dim defauftByte = Encoding.Default.GetBytes(a)
    5. Dim unicode As Encoding = Encoding.Unicode
    6. Dim UniByte As Byte() = Encoding.Convert(defaultCode, unicode, defauftByte)
    7. Dim Str = unicode.GetString(UniByte)
    8. 'Dim unicodeBytes As Byte() = unicode.GetBytes(a)
    9. a = Str
    10. Next


    Wenn mir damit jemand helfen könnte, wäre das richtig klasse.

    CodeTags gesetzt ~VaporiZed

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

    Pinot schrieb:

    Encoding.Default
    ist falsch. Du musst Dir die korrekte Codepage raussuchen.
    Füge den chinesischen Text ins Notepad++ ein und klicker mal die Codierung durch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    unter .NET ist es UTF-8, unter .NET Framework normalerweise irgend ne ANSI-Codepage:

    Microsoft schrieb:

    In .NET Framework ruft die Default Eigenschaft immer die aktive Codeseite des Systems ab
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,
    hier eine Beispieldatei.

    Im Notepad ++ sagt wird GB2312 angezeigt.
    Wie bekomme ich das im VB.NEt umgesetzt.

    Was Endcoding default heißt, kann ich nicht sagen. WEnn ich es verewende, hat es in der Regel immer geklappt, was Umlaute betrift.

    schon einmal vielen Dank für eure Mühe


    Kleines Update,
    ich habe mir unter Nugget von MS eine System.Text.Encoding.Codepage heruntergeladen. Jetzt frisst readalllines(f) die Datei. Also ohne weitere Parameter.
    Ob das die richtige Lösung ist, weiß ich nicht. Verstehen tue ich das nicht. Da ich in Zukunft häufiger mit chinesischen Dateien zu tun haben werde, wäre mir eine Lösung, die nachvollziehbar ist, lieber

    Vielen Dank an Alle
    Dateien
    • 20240410_1.txt

      (28,53 kB, 123 mal heruntergeladen, zuletzt: )

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

    Im Notepad ++ sagt wird GB2312 angezeigt.
    Wie bekomme ich das im VB.NEt umgesetzt.


    Versuch mal:

    VB.NET-Quellcode

    1. ' Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 'Nur Bei NET Core erforderlich
    2. IO.File.ReadAllLines(f, Encoding.GetEncoding(52936)


    Was Endcoding default heißt, kann ich nicht sagen.


    Wie Vaporizet schon schrieb:
    Bei Net (Core) : UTF8
    Bei Net Framework: Ansi (In DE CP1252)
    Hallo @Pinot

    Wie du im Bild im Anhang (Net Core 8.0) erkennen kannst, hat das bei mir mit UTF8 perfekt geklappt.

    Das Einlesen funktioniert also mit UTF8. Wenn du es jetzt natürlich in eine neue Datei speicherst, musst du schauen, dass auch wieder richtig reingeschrieben wird.

    Freundliche Grüsse

    exc-jdbi
    Bilder
    • pic1.png

      53,48 kB, 1.106×582, 55 mal angesehen
    Da bei Pinot das Einlesen mit UTF8 nicht funktionierte und Notepad++ als Codepage GB2312 anzeigte, gehe ich davon aus, dass es sich nicht um eine unveränderte Originaldatei handelt.

    @exc-jdbi
    Bei der angehängten Datei handelt es sich um eine UTF8 Datei ohne BOM.
    Notepad++ zeigt auch UTF8 an.
    Deswegen funktioniert das Einlesen mit UTF8.
    Sorry,
    habe die falsche DAtei hochgeladen.
    Versehentlich habe ich die Datei genommen, mit der ich rum expermitiert habe.
    Hier die Datei, die mir Probleme bereitet.



    Zwischenzeitlich habe ich es mit dem Vorschlag von Eierlein probiert,
    IO.File.ReadAllLines(f, Encoding.GetEncoding(52936).
    Der hat leider nicht geklappt.
    Aber Dank des Hinweis konnte ich mit .getendcodings mir alle möglichen Varianten des Encodings anzeigen lassen.
    Darunter fand sich 936, GB2312. Der klappt
    Noch einmal vielen Dank.
    Dateien
    • 20240410_1.csv

      (28,48 kB, 120 mal heruntergeladen, zuletzt: )

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

    @Pinot Wie gesagt: Öffne das Dokument im Notepad++, da bekommst Du es angezeigt:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mit NotePad++ ist das wirklich noch praktisch.

    Wenn du es per Code machen willst, wäre das hier sicher mal ein Anfang (siehe Code unten). Unglücklicherweise kenn ich noch nicht alle BOM-Bytes, sonst hätte ich es noch besser hingekriegt. Muss mich mal wieder in diese ganze Encoding-Geschichte rein schauen.

    Wie man erkennen kann wäre Encoding gb2312 und x-cp20936 die richtige Wahl.

    Freundliche Grüsse

    exc-jdbi

    Encodings

    cs

    C#-Quellcode

    1. public static void WriteTextSippetsEncoding(
    2. string readfile, string writefile, int linecount)
    3. {
    4. static void PrintOut_ReadLines(
    5. string readfile, string writefile, int linecount, Encoding ec)
    6. {
    7. var iter = 0;
    8. var sb = new StringBuilder();
    9. sb.AppendLine(ec.HeaderName);
    10. foreach (var lines in File.ReadAllLines(readfile, ec))
    11. {
    12. iter++;
    13. sb.AppendLine(lines);
    14. if (iter == linecount) break;
    15. }
    16. sb.AppendLine();
    17. File.AppendAllText(writefile,sb.ToString(), Encoding.UTF8);
    18. }
    19. var instance = CodePagesEncodingProvider.Instance;
    20. foreach (var ec in instance.GetEncodings())
    21. {
    22. PrintOut_ReadLines(readfile,writefile, linecount, ec.GetEncoding());
    23. }
    24. }

    vb

    VB.NET-Quellcode

    1. ​Public Shared Sub WriteTextSippetsEncoding(
    2. readfile As String, writefile As String, linecount As Int32)
    3. Dim PrintOut_ReadLines =
    4. Sub(read_file As String, write_file As String, line_count As Int32, ec As Encoding)
    5. Dim iter = 0
    6. Dim sb = New StringBuilder()
    7. sb.AppendLine(ec.HeaderName)
    8. For Each lines In File.ReadAllLines(read_file, ec)
    9. iter += 1
    10. sb.AppendLine(lines)
    11. If iter = line_count Then Exit For
    12. Next
    13. sb.AppendLine()
    14. File.AppendAllText(write_file, sb.ToString(), Encoding.UTF8)
    15. End Sub
    16. Dim instance = CodePagesEncodingProvider.Instance
    17. For Each ec In instance.GetEncodings()
    18. PrintOut_ReadLines(readfile, writefile, linecount, ec.GetEncoding())
    19. Next
    20. End Sub




    C#-Quellcode

    1. WriteTextSippetsEncoding("20240410_1.csv","data.txt", 5);

    Visual Basic-Quellcode

    1. ​WriteTextSippetsEncoding("20240410_1.csv", "data.txt", 5)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()