Konvertierung zu UTF-8 ohne BOM

  • Hi,

    ich generiere für OpenLDAP und ein Mozilla-Schema aus einem *.csv ein *.ldif für den Datenimport. Funktioniert alles bestens - mit Ausnahme der Umlaute beim LDAP-Import. Perfekt geht es, wenn ich das generierte *.ldif in Notepad++ öffne und unter "Kodierung -> Konvertiere UTF-8 ohne BOM" die Datei ändere und dann abspeichere.

    Gibt es einen Weg, das in AutoIt zu machen? Z.B. aus der fertigen *.ldif? Im wesentlichen ist FileWrite für die Generierung des *.ldif zuständig.

    Dank und Gruß
    Thomas

    Einmal editiert, zuletzt von TJF (4. Februar 2011 um 17:26)

  • Hi,
    schau dir mal in der Hilfe die mode-Parameter von Fileopen() an, dort gibt es

    Zitat von HILFE zu FileOpen()

    128 = Verwende Unicode-UTF8 Kodierung im Lese- und Schreibmodus. Lesen überschreibt ein existierendes BOM nicht.
    256 = Verwende Unicode-UTF8 (ohne BOM) im Lese- und Schreibmodus.


    Ansonsten kannst du per binarytostring() bzw stringtobinary() in UTF-8 umwandeln

  • Hi Andy,

    danke für den Tipp. FileOpen mit 256 "verwendet" zwar das richtige. Ich brauche aber eine Konvertierung. Da hatte ich in Notepad++ schon etwas gesucht ... BinarytoString und umgekehrt kann nur UTF-8 (rein)...

    Gruß
    Thomas

  • Ich hab mir jetzt nicht alles durchgelesen, aber meinst du ungefähr so?

    Spoiler anzeigen
    [autoit]

    #include <string.au3>

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

    Func _stringreplaceUTF8($string)
    If $string = "" Or $string = " " Then
    SetError(1)
    EndIf
    $string = StringReplace($string, 'Â', ' ')
    $string = StringReplace($string, '¤', '¤')
    $string = StringReplace($string, '¦', '¦')
    $string = StringReplace($string, '§', '§')
    $string = StringReplace($string, '¨', '¨')
    $string = StringReplace($string, '©', '©')
    $string = StringReplace($string, '«', '«')
    $string = StringReplace($string, '¬', '¬')
    $string = StringReplace($string, 'Â-', '-')
    $string = StringReplace($string, '®', '®')
    $string = StringReplace($string, '°', '°')
    $string = StringReplace($string, '±', '±')
    $string = StringReplace($string, '´', '´')
    $string = StringReplace($string, 'µ', 'µ')
    $string = StringReplace($string, '¶', '¶')
    $string = StringReplace($string, '·', '·')
    $string = StringReplace($string, '¸', '¸')
    $string = StringReplace($string, '»', '»')
    $string = StringReplace($string, 'Ã?', 'Á')
    $string = StringReplace($string, 'Â', 'Â')
    $string = StringReplace($string, 'Ä', 'Ä')
    $string = StringReplace($string, 'Ç', 'Ç')
    $string = StringReplace($string, 'É', 'É')
    $string = StringReplace($string, 'Ë', 'Ë')
    $string = StringReplace($string, 'Ã?', 'Í')
    $string = StringReplace($string, 'ÃŽ', 'Î')
    $string = StringReplace($string, 'Ó', 'Ó')
    $string = StringReplace($string, 'Ô', 'Ô')
    $string = StringReplace($string, 'Ö', 'Ö')
    $string = StringReplace($string, '×', '×')
    $string = StringReplace($string, 'Ú', 'Ú')
    $string = StringReplace($string, 'Ãoe', 'Ü')
    $string = StringReplace($string, 'Ã?', 'Ý')
    $string = StringReplace($string, 'ß', 'ß')
    $string = StringReplace($string, 'á', 'á')
    $string = StringReplace($string, 'â', 'â')
    $string = StringReplace($string, 'ä', 'ä')
    $string = StringReplace($string, 'ç', 'ç')
    $string = StringReplace($string, 'é', 'é')
    $string = StringReplace($string, 'ë', 'ë')
    $string = StringReplace($string, 'Ã-', 'í')
    $string = StringReplace($string, 'î', 'î')
    $string = StringReplace($string, 'ó', 'ó')
    $string = StringReplace($string, 'ô', 'ô')
    $string = StringReplace($string, 'ö', 'ö')
    $string = StringReplace($string, '÷', '÷')
    $string = StringReplace($string, 'ú', 'ú')
    $string = StringReplace($string, 'ü', 'ü')
    $string = StringReplace($string, 'ý', 'ý')
    $string = StringReplace($string, 'Ä‚', 'Ã')
    $string = StringReplace($string, 'ă', 'ã')
    $string = StringReplace($string, 'Ä„', '¥')
    $string = StringReplace($string, 'Ä…', '¹')
    $string = StringReplace($string, 'Ć', 'Æ')
    $string = StringReplace($string, 'ć', 'æ')
    $string = StringReplace($string, 'ÄOE', 'È')
    $string = StringReplace($string, 'Ä?', 'è')
    $string = StringReplace($string, 'ÄŽ', 'Ï')
    $string = StringReplace($string, 'Ä?', 'ï')
    $string = StringReplace($string, 'Ä?', 'Ð')
    $string = StringReplace($string, 'Ä‘', 'ð')
    $string = StringReplace($string, 'Ę', 'Ê')
    $string = StringReplace($string, 'Ä™', 'ê')
    $string = StringReplace($string, 'Äš', 'Ì')
    $string = StringReplace($string, 'Ä›', 'ì')
    $string = StringReplace($string, 'Ĺ', 'Å')
    $string = StringReplace($string, 'ĺ', 'å')
    $string = StringReplace($string, 'Ľ', '¼')
    $string = StringReplace($string, 'ľ', '¾')
    $string = StringReplace($string, 'Å?', '£')
    $string = StringReplace($string, 'Å‚', '³')
    $string = StringReplace($string, 'Ń', 'Ñ')
    $string = StringReplace($string, 'Å„', 'ñ')
    $string = StringReplace($string, 'Ň', 'Ò')
    $string = StringReplace($string, 'ň', 'ò')
    $string = StringReplace($string, 'Å?', 'Õ')
    $string = StringReplace($string, 'Å‘', 'õ')
    $string = StringReplace($string, 'Å”', 'À')
    $string = StringReplace($string, 'Å•', 'à')
    $string = StringReplace($string, 'Ř', 'Ø')
    $string = StringReplace($string, 'Å™', 'ø')
    $string = StringReplace($string, 'Åš', 'OE')
    $string = StringReplace($string, 'Å›', 'oe')
    $string = StringReplace($string, 'Åž', 'ª')
    $string = StringReplace($string, 'ÅŸ', 'º')
    $string = StringReplace($string, 'Å', 'Š')
    $string = StringReplace($string, 'Å¡', 'š')
    $string = StringReplace($string, 'Å¢', 'Þ')
    $string = StringReplace($string, 'Å£', 'þ')
    $string = StringReplace($string, 'Ť', '?')
    $string = StringReplace($string, 'Å¥', '?')
    $string = StringReplace($string, 'Å®', 'Ù')
    $string = StringReplace($string, 'ů', 'ù')
    $string = StringReplace($string, 'Å°', 'Û')
    $string = StringReplace($string, 'ű', 'û')
    $string = StringReplace($string, 'Ź', '?')
    $string = StringReplace($string, 'ź', 'Ÿ')
    $string = StringReplace($string, 'Å»', '¯')
    $string = StringReplace($string, 'ż', '¿')
    $string = StringReplace($string, 'Ž', 'Ž')
    $string = StringReplace($string, 'ž', 'ž')
    $string = StringReplace($string, 'ˇ', '¡')
    $string = StringReplace($string, '˘', '¢')
    $string = StringReplace($string, 'Ë™', 'ÿ')
    $string = StringReplace($string, 'Ë›', '²')
    $string = StringReplace($string, 'Ë?', '½')
    $string = StringReplace($string, '–', '–')
    $string = StringReplace($string, '—', '—')
    $string = StringReplace($string, '‘', '‘')
    $string = StringReplace($string, '’', '’')
    $string = StringReplace($string, '‚', '‚')
    $string = StringReplace($string, 'â€oe', '“')
    $string = StringReplace($string, 'â€?', '”')
    $string = StringReplace($string, '„', '„')
    $string = StringReplace($string, 'â€', '†')
    $string = StringReplace($string, '‡', '‡')
    $string = StringReplace($string, '•', '•')
    $string = StringReplace($string, '…', '…')
    $string = StringReplace($string, '‰', '‰')
    $string = StringReplace($string, '‹', '‹')
    $string = StringReplace($string, '›', '›')
    $string = StringReplace($string, '€', '€')
    $string = StringReplace($string, 'â„¢', '™')
    $string = StringReplace($string, '€“', '–')
    $string = StringReplace($string, '€”', '—')
    $string = StringReplace($string, '€˜', '‘')
    $string = StringReplace($string, '€™', '’')
    $string = StringReplace($string, '€š', '‚')
    $string = StringReplace($string, '€oe', '“')
    $string = StringReplace($string, '€?', '”')
    $string = StringReplace($string, '€ž', '„')
    $string = StringReplace($string, '€', '†')
    $string = StringReplace($string, '€¡', '‡')
    $string = StringReplace($string, '€¢', '•')
    $string = StringReplace($string, '€¦', '…')
    $string = StringReplace($string, '€°', '‰')
    $string = StringReplace($string, '€¹', '‹')
    $string = StringReplace($string, '€º', '›')
    $string = StringReplace($string, '‚¬', '€')
    $string = StringReplace($string, '„¢', '™')
    $string = StringReplace($string, 'Ãœ', 'ü')
    Return $string
    EndFunc

    [/autoit]
  • Hi,

    danke, leider auch nicht... Ist vielleicht zu speziell. Ich habe es einfach durchgetestet, welche Variante der Linux-OpenLDAP vom Win-Rechner in Sachen Umlaute korrekt abbildet. Das war eben genau die o.g. Variante - mit Notepad++ geöffnet und konvertiert. Ist ja kein großer Umstand, wenn man das weiter so macht. Wäre halt schön gewesen, wenn man das gleich mit dem Script hätte richtig konvertieren können...

    Dank und Gruß
    Thomas

  • Hi,

    nur falls jemand ähnlich heikle Umwandlungen vornehmen will, meine Lösung i.V.m. "_RunDOS":

    Code
    iconv -f CP1252 -t UTF-8 input_ansi.ldif > output_utf.ldif

    iconv für windows gibt es hier . Es wird immer, je nachdem ob Umlaute oder Sonderzeichen vorhanden sind, die für diesen Zweck richtige UTF-8 (ohne Bom) oder eine ANSI-Datei generiert. "CP1252" steht für die spezielle ANSI-Form. Alle ansprechbaren Varianten erhält man mit

    Code
    iconv -l

    Viele Grüße
    Thomas

  • Je nach Codepage ist auch folgendes Möglich:

    Spoiler anzeigen
    [autoit]

    $hInput = FileOpen("input", 0)
    $hOutput = FileOpen("output", 258)
    $Error = False
    While 1
    $sChunk = FileRead($hInput, 2048)
    If @error <> 0 Then
    $Error = @error > 0
    ExitLoop
    EndIf
    If Not FileWrite($hOutput, $sChunk) Then
    $Error = True
    ExitLoop
    EndIf
    WEnd
    FileClose($hInput)
    FileClose($hOutput)

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

    If $Error Then
    MsgBox(0, '', "Fehler beim konvertieren")
    Else
    MsgBox(0, '', "Fertig)
    EndIf

    [/autoit]
  • Habe es gerade direkt mit Deinem Code getestet. Die output-Datei ist immer noch ANSI (lt. Notepad++) und der Server importiert anstatt des Umlautes ein Quadrat :(

  • Habe es gerade direkt mit Deinem Code getestet. Die output-Datei ist immer noch ANSI (lt. Notepad++) und der Server importiert anstatt des Umlautes ein Quadrat :(


    Ich habe input.txt in Ansi und output.txt kommt dann als UTF8 ohne BOM an. Die Dateien MÜSSEN unterschiedlich benannt sein, sonst funktioniert der Code nicht.

  • Danke Schnuecks, hatte ich schon getetestet: 128 funktioniert. Macht aber UTF-8. Kurz: Ergebnis ist das was man bekommt, wenn man z.B. in Notepad++ unter "Kodierung" anstatt "Konvertiere zu UTF-8 ohne Bom" nur "UTF-8" auswählt (keine Konvertierung).

    @ Progandy
    Ich habe zwei verschiedene Datei-Namen. Hatte es bisher mit "input.ldif" und "output.ldif" gemacht. Habe vorsichtshalber *.txt auch getestet. Gleiches Ergebnis. Die output-Datei in Notepad++ geöffnet zeigt "ANSI" an. Importiert dasselbe ... Ich habe den Eindruck, dass FileOpen i.V.m. 256 ein Problem hat. Alle anderen zeigen in N++ das gewünschte Ergebnis. Evtl. liegt das an meiner V.3.3.20 ...

  • Jetzt gibt es in diesem Zusammenhang ein weiteres Problem. Wenn ich eine Rückumwandlung schreibe, also einen OpenLDAP-Export mit slapcat ausführe und die resultierende export.ldif via einem großen Array in eine weiterverwendbare *.csv umwandle, dann ergeben sich bei Umlauten solche Zeilen. Der zweifache Doppelpunkt weist darauf hin:

    Code
    mozillaHomeCountryName:: w5ZzdGVycmVpY2g=

    Das heißt nichts anderes als:

    Code
    mozillaHomeCountryName: Österreich

    Ich habe mir mal testweise eine Mail geschickt mit dem Betreff: Österreich . Da steht dann in meinem Mail-Notifier, der vermutlich UTF-8 nicht kann in Ascii:

    Code
    Subject: =?UTF-8?B?w5ZzdGVycmVpY2g=?=
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 7bit

    Kann mir jemand einen Tipp geben, wie ich in meinem Quelltext aus dem "w5ZzdGVycmVpY2g=" wieder "Österreich" machen kann?

    Dank und Gruß
    Thomas

  • Ich weiß, dass ich mal eine UDF dafür gemacht habe, aber ich finde sie gerade nicht mehr.

    https://autoit.de/index.php?page…87721#post87721
    Im wesentlichen ist das eine base64-Kodierung von einem UTF-8 string. Also:

    [autoit]

    $result = ReadAsUTF8(base64decode("w5ZzdGVycmVpY2g="))
    Func ReadAsUTF8($string)
    If Not IsBinary($string) Then $string = StringToBinary($string, 1)
    Return BinaryToString($string, 4)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (10. Februar 2011 um 15:48)