Encodingproblem bei Sonderzeichen (UTF-8)

  • VB6

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von moonl1te.

    Encodingproblem bei Sonderzeichen (UTF-8)

    Hallo,

    ich habe ein Encodingproblem beim Speichern eines Strings mit der Methode Print.

    Ich nutze VB, um ein Makro für MS Excel2000 zu schreiben. Es liest den Inhalt einer Zelle aus und speichert diesen in eine Datei:

    Quellcode

    1. Dim ergebnis As String
    2. ergebnis = Cells(i, 1).Value
    3. Open "c:\MyFile.xml" For Output As #1
    4. Print #1, ergebnis
    5. Close #1

    Im Prinzip funktioniert das auch genau so, wie ich das will. Einziges Problem: Umlaute werden zwar abgespeichert, aber im "falschen" Encoding! Ich möchte die Datei hinterher gerne als UTF-8 Datei haben, aber wie mache ich das?
    Wenn ich mir die Datei mit einem normalen Texteditor anschaue, werden die Umlaute korrekt dargestellt, bei einem UTF-8 Editor werden statt der Umlaute allerdings leider nur rechteckige Kästchen angezeigt.

    Für alle Tipps wäre ich echt dankbar! :)

    Grüße,
    mooni


    Topic auf VB6 und älter gestellt, da es sich hier um eine generelle "classic"-VB-Frage handelt.

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

    Sonderzeichen in UTF-8 haben mindestens 2 Byte. Du könntest eine Funktion programmieren, welche die ASCII Zeichen nach UTF-8 ändert und dann er speichern.

    Visual Basic-Quellcode

    1. Dim ergebnis As String
    2. ergebnis = Cells(i, 1).Value
    3. ergebnis= ascii2utf(ergebnis)
    4. Open "c:\MyFile.xml" For Output As #1
    5. Print #1, ergebnis
    6. Close #1


    Die Funtion könnte z.B. so aussehen:

    Visual Basic-Quellcode

    1. Private Function ascii2utf(ByVal s As String) As String
    2. Dim i As Integer
    3. Dim m1 As Integer
    4. Dim m2 As String
    5. Dim m3 As Integer
    6. For i = 1 To Len(s)
    7. m1 = Asc(Mid$(s, i, 1))
    8. If m1 > 127 Then
    9. If m1 = 167 Then
    10. m2 = m2 + Chr$(195) + Chr$(167)
    11. Else
    12. m2 = m2 + Chr$(195)
    13. Select Case m1
    14. Case 228
    15. m3 = 164
    16. Case 196
    17. m3 = 132
    18. Case 252
    19. m3 = 188
    20. Case 220
    21. m3 = 201
    22. Case 246
    23. m3 = 182
    24. Case 214
    25. m3 = 150
    26. Case 223
    27. m3 = 159
    28. m2 = m2 + Chr$(m3)
    29. End If
    30. Else
    31. m2 = m2 + Chr$(m1)
    32. End If
    33. Next i
    34. ascii2utf = m2
    35. End Function

    Ist aber nicht getestet.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Danke, peterfido.

    m2 muss ein String sein, wenn ich mich nicht täusche. ;)
    Trotzdem funktioniert's leider nicht. Es werden doch schlicht die Umlaute durch andere Zeichen (des selben Encodings) ersetzt - ich sehe nicht, wo da eine Umformatierung nach UTF-8 stattfindet. Oder übersehe ich was?

    Gruß,
    mooni
    Ich habe keinen utf8 editor hier, meine aber, dass diese Dateien als Binary geschrieben werden sollten. Demnach fehlen noch Steuercodes.
    Ich habe mir gerade mal nen utf8-fähigen Texteditor besorgt und einfach die Umlaute speichern lassen. Sieht so aus, als ob als Dateiheader ef bb bf(239, 187, 191) stehen muss.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Danke! Hab's inzwischen ganz simpel gelöst:

    Visual Basic-Quellcode

    1. Dim ergebnis, converted As String
    2. Public Sub convertToUTF8()
    3. Dim i As Integer
    4. Dim temp As String
    5. For i = 1 To Len(ergebnis)
    6. temp = Mid$(ergebnis, i, 1)
    7. Select Case temp
    8. Case "€"
    9. temp = "ä"
    10. Case "¡"
    11. temp = "¡"
    12. Case "¢"
    13. temp = "¢"
    14. Case "£"
    15. temp = "£"
    16. Case "¤"
    17. temp = "¤"
    18. Case "¥"
    19. temp = "Â¥"
    20. .
    21. .
    22. .
    23. End Select
    24. converted = converted & temp
    25. Next i
    26. End Sub

    Meines Wissens nach wird eine Datei dann als UTF-8 codiert interpretiert, wenn mindestens eines der Zeichen in der Datei UTF-8 codiert ist.
    Na, wie auch immer, der Quellcode liefert mir das benötigte Ergebnis! :]