Unicode-Literals beim einlesen einer Datei konvertieren

  • Hallo

    Ich muss eine Datei parsen die anscheinend Unicode-Literals enthält, aber selbst ANSI ist. Ich weiß nicht wie ich das konvertieren könnte ohne irgendwie quasi manuell jede Line mit StringInStr... und einer Unicode-Liste die ich mir zusammenkopiere abzugleichen oder so.

    Das ganze ist so, dass ein Programm das ich nicht anpassen kann Informationen in eine Datei anträgt, und zb den Buchstaben 'ä' in '\xc3\xa4' ändert und das steht dann so in der Datei bzw gelesenen Line. Wie könnte ich dieses '\xc3\xa4' zusammen mit den ganzen anderen Unicode-Literals bei/nach dem einlesen mit FileRead schnell und effizient zu 'ä' konvertieren, ohne eine ganze Unicode-Tabelle für's Ersetzen in meinen Code zu kopieren oder ähnlich umfangreiches?

    Ich hoff ihr wißt da was simples. Ich hab mich halb totgegooglet und rumprobiert aber dass ich noch garkeine Ahnung von Unicode, UTF-8, Ansi etc hab hilft da nicht grade ... :pinch:

  • Klar!

    Ich hab gestern mal noch rumgespielt und ne kleine Notlösung gebastelt, falls hier keiner ne bessere Idee hat... . Ich hab halt mal so den lateinischen und kyrillischen Zeichensatz (darauf stoß ich am meisten) in ne Datei kopiert die ich dann halt abgleiche. Tut seinen Job aber ist halt unvollständig - mit meiner Methode (bitte nicht lachen, ich bin kein erfahrender Coder ^^) wäre ein kompletter Abgleich wohl ziemlich langsam...

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Get_File()

    [/autoit] [autoit][/autoit] [autoit]

    Func Get_File()
    Local $utf8_literals_array = Get_UTF8LiteralsArray()
    If $utf8_literals_array = False Then
    ConsoleWrite('Error beim einlesen der utf8-literals.txt' & @CRLF)
    Return(False)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Einlesen der Parsing File in Array
    $file_hwnd = FileOpen(@ScriptDir & '\parsing_file.txt', 0)
    $file_read = FileRead($file_hwnd)
    $regexp_array = StringRegExp($file_read, '(?s)(?m)(.*?)\r\n', 3)
    If @error Then
    ConsoleWrite('Fehler beim parsen der parsing_file.txt' & @CRLF)
    Return(False)
    EndIf
    _ArrayDisplay($regexp_array)

    [/autoit] [autoit][/autoit] [autoit]

    ; Unwandlung von Escapes
    $regexp_array_size = UBound($regexp_array)
    Local $converted_array[$regexp_array_size]
    For $c_main = 0 To $regexp_array_size-1
    If StringInStr($regexp_array[$c_main],'\x',1) Then ; Nur das utf8_literals_array durchlaufen, wenn ein \x Tag gefunden wird
    For $c_unicode = 0 To UBound($utf8_literals_array)-1
    $regexp_array[$c_main] = StringReplace($regexp_array[$c_main],$utf8_literals_array[$c_unicode+1],$utf8_literals_array[$c_unicode])
    If @extended > 0 Then ; Nach jedem Ersetzen prüfen, ob ein vorzeitiges beenden des Abgleichs möglich ist
    If Not StringInStr($regexp_array[$c_main],'\x',1) Then ExitLoop
    EndIf
    $c_unicode += 1
    Next
    EndIf
    $converted_array[$c_main] = $regexp_array[$c_main]
    Next
    _ArrayDisplay($converted_array)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Get_UTF8LiteralsArray()
    ; Übertragung einer Liste mit UTF8-Literals in Array
    $file_hwnd = FileOpen(@ScriptDir & '\utf8-literals.txt', 0)
    If $file_hwnd = -1 Then Return(False)
    $file_read = FileRead($file_hwnd)
    FileClose($file_hwnd)
    $utf8_literals_array = StringRegExp($file_read,'(?s)(?m)(.).{4}(.*?)\r\n',3)
    If @error Then Return(False)
    If Not IsArray($utf8_literals_array) Then Return(False)
    Return($utf8_literals_array)
    EndFunc

    [/autoit]


    Im Anhang findet ihr die autoit.de/wcf/attachment/21587/ - darin ist die von mir aus dem Netz kopierte UTF8-Literals-Tablle.
    Die autoit.de/wcf/attachment/21592/ ist eine Beispieldatei dafür, wie dass so in der Datei aussieht, die ich versuche zu parsen.

    Einfach beide Dateien mit dem Script in den selben Ordner packen...

    Hab auch mit StringToAscii/Binary/Hex/etc rumgespielt aber da hab ich einfach zu wenig Ahnung von der Materie schätz ich bzw es hat halt nix damit zu tun :(

  • Mal auf die Schnelle

    [autoit]

    #include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    $text = FileRead("parsing_file.txt")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text = ' & $text & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit][autoit][/autoit][autoit]

    Local $literals
    _FileReadToArray("utf8-literals.txt", $literals)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    For $i = 1 To UBound($literals) - 1 ;alle zeilen in der Datei
    $zeichen = StringLeft($literals[$i], 1) ;zeichen
    $code = StringTrimLeft($literals[$i], 5) ;Zeichen und ---- abschneiden
    $text = StringReplace($text, $code, $zeichen, 0, 1) ;ersetzen
    Next

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "utf8-literals", $text)

    [/autoit]