charset=UTF-8 in ANSII-Codierung umwandeln ?

  • Hallo Leute,

    ich habe in Ordner c:\datenbank\ ca. 20000 Dateien (je 6-7 KB groß) die mit charset=UTF-8 erstellt worden sind.
    Gibt es die Möglichkeit alle Dateien diesen Ordner in charset=iso-8859-2 bzw. ANSII-Codierung zu speichen / zu konvertieren ?

    Besten Dank im Voraus !

    Viele Grüße,
    Dino

  • Hallo Mega,

    in Dateien sind die Zeichen: š, đ, č, ć, ž, Š, Đ, Č, Ć, Ž vorhanden, die wie folgt s, dj, c, c, z, S, Dj, C, C, Z ersetzt werden sollen, dann muss die Codierung nicht stattfinden.
    Ich weiß es nicht was leichter ist die Zeichen zu ersetzten oder Dateicodierung zu ändern (was mir weiter helfen würde).

    Anbei die Dateien beide in UTF-8 Codierung:
    http://arka.foi.hr/~fvisic/_tekst=18632
    http://arka.foi.hr/~fvisic/_tekst=18632_nacher

    In der Datei _tekst=18632_nacher habe ich nur die obige Zeichen, falls vorhanden "zu Fuß" im Notepad ersetzt.

    Viele Grüße,
    Dino

  • Ich hätte es jetzt so gelöst

    Spoiler anzeigen
    [autoit]

    Global $aZeichensatz[10][2] = [[ChrW(353),'s'],[ChrW(273),'dj'],[ChrW(269),'c'],[ChrW(263),'c'],[ChrW(382),'z'],[ChrW(352),'S'],[ChrW(272),'Dj'],[ChrW(268),'C'],[ChrW(262),'C'],[ChrW(381),'Z']]

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

    $Datei = FileOpen('Test.txt', 0)
    $Text = FileRead($Datei)
    FileClose($Datei)

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

    For $i = 0 To UBound($aZeichensatz) -1
    $Text = StringReplace($Text, $aZeichensatz[$i][0], $aZeichensatz[$i][1])
    Next

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

    $Datei_Neu = FileOpen("Test_neu.txt", 10)
    FileWrite($Datei_Neu, $Text)

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

    FileClose($Datei_Neu)

    [/autoit]


    Edit: Speziel für dich ;)
    Vorher aber besser die Dateien sichern!

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>

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

    Global $aZeichensatz[10][2] = [[ChrW(353),'s'],[ChrW(273),'dj'],[ChrW(269),'c'],[ChrW(263),'c'],[ChrW(382),'z'], _
    [ChrW(352),'S'],[ChrW(272),'Dj'],[ChrW(268),'C'],[ChrW(262),'C'],[ChrW(381),'Z']]

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

    $Ordner = FileSelectFolder("Ordner mit UTF-8 Dateien wählen","C:\datenbank\")
    If $Ordner = "" Then Exit
    $aDateien = _FileListToArray($Ordner, "*", 1)

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

    For $k = 1 To $aDateien[0]
    $Datei = FileOpen($Ordner&"\"&$aDateien[$k], 0)
    $Text = FileRead($Datei)
    FileClose($Datei)

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

    For $i = 0 To UBound($aZeichensatz) -1
    $Text = StringReplace($Text, $aZeichensatz[$i][0], $aZeichensatz[$i][1])
    Next

    $Datei = FileOpen($Ordner&"\"&$aDateien[$k], 10)
    FileWrite($Datei, $Text)
    FileClose($Datei)
    Next

    [/autoit]
  • @Mega: ich habe es ohne Erfolg getestet. Die Datei hat nur anderen Name die Codierung ist bei UTF-8 geblieben.

    funkey: Die Dateien wurden neu gespeichert, aber ich sehe keine Veränderungen die Zeichen wurden nicht ersetzt.
    Wie sieht es bei dir aus ?

    Viele Grüße,
    Dino

    • Offizieller Beitrag

    Hi,

    bringt das was?
    Die Frage ist ja, was soll mit den nicht darstellbaren Zeichen passieren?

    Spoiler anzeigen
    [autoit]

    $t = FileRead(FileOpen('_tekst=18632.txt', 128))
    FileWrite('ANSI_tekst=18632.txt', _UTF8ToAnsi($t))

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

    Func _UTF8ToAnsi($sUTF8)
    Local $iLen = StringLen($sUTF8)
    Local $stBuf = DllStructCreate("byte[" & $iLen * 2 & "];byte[2]")

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

    Local $aRet = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
    "int", 65001, "int", 0, _
    "str", $sUTF8, "int", -1, _
    "ptr", DllStructGetPtr($stBuf), "int", $iLen * 2 + 2)

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

    Local $stOut = DllStructCreate("char[" & $iLen & "];char")

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

    $aRet = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
    "int", 0, "int", 0, _
    "ptr", DllStructGetPtr($stBuf), "int", -1, _
    "ptr", DllStructGetPtr($stOut), "int", $iLen + 1, _
    "int", 0, "int", 0)

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

    Return DllStructGetData($stOut, 1)
    EndFunc ;==>_UTF8ToAnsi

    [/autoit]

    Mega

  • @Mega: Könntest du bitte den Code anpassen, dass er alle Dateien des Ordners C:\Datenbank abarbeitet ?!

    funkey: Könntest du bitte mit angehängten Dateien nochmal testen, ob es bei dir geht. Bin mir nicht sicher, ob ich bei ersten Link die richtige Dateien genommen habe.
    Files

    Besten Dank !

    Viele Grüße,
    Dino

    • Offizieller Beitrag

    Hi,

    teste mal :

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

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

    Global $path = 'C:\Datenbank'
    Global $filesList_A = _FileListToArray($path, "*", 1) ; * oder *.txt

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

    For $i = 1 To UBound($filesList_A) - 1
    $t = FileRead(FileOpen($path & '\' & $filesList_A[$i], 128))
    FileWrite($path & '\ANSI_' & $filesList_A[$i], _UTF8ToAnsi($t))
    Next

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

    Func _UTF8ToAnsi($sUTF8)
    Local $iLen = StringLen($sUTF8)
    Local $stBuf = DllStructCreate("byte[" & $iLen * 2 & "];byte[2]")

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

    Local $aRet = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
    "int", 65001, "int", 0, _
    "str", $sUTF8, "int", -1, _
    "ptr", DllStructGetPtr($stBuf), "int", $iLen * 2 + 2)

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

    Local $stOut = DllStructCreate("char[" & $iLen & "];char")

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

    $aRet = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
    "int", 0, "int", 0, _
    "ptr", DllStructGetPtr($stBuf), "int", -1, _
    "ptr", DllStructGetPtr($stOut), "int", $iLen + 1, _
    "int", 0, "int", 0)

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

    Return DllStructGetData($stOut, 1)
    EndFunc ;==>_UTF8ToAnsi

    [/autoit]

    Mega

  • kA wieso es Zuhause ging, so sollte es jedoch jetzt auch gehen, auch wenn Mega auch schon eine Lösung hat.

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>

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

    Global $aZeichensatz[10][2] = [[ChrW(353),'s'],[ChrW(273),'dj'],[ChrW(269),'c'],[ChrW(263),'c'],[ChrW(382),'z'], _
    [ChrW(352),'S'],[ChrW(272),'Dj'],[ChrW(268),'C'],[ChrW(262),'C'],[ChrW(381),'Z']]

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

    $Ordner = FileSelectFolder("Ordner mit UTF-8 Dateien wählen","C:\datenbank\")
    If $Ordner = "" Then Exit
    $aDateien = _FileListToArray($Ordner, "*", 1)

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

    For $k = 1 To $aDateien[0]
    $Datei = FileOpen($Ordner&"\"&$aDateien[$k], 0)
    $Text = BinaryToString(FileRead($Datei),4)
    FileClose($Datei)

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

    For $i = 0 To UBound($aZeichensatz) -1
    $Text = StringReplace($Text, $aZeichensatz[$i][0], $aZeichensatz[$i][1], 0, 1)
    Next

    $Datei = FileOpen($Ordner&"\"&$aDateien[$k], 10)
    FileWrite($Datei, $Text)
    FileClose($Datei)
    Next

    [/autoit]