Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: UTF-8-Code in Asci umwandeln

UTF-8-Code in Asci umwandeln
10.06.2016 15:44:08
Werner
Hallo Forum,
ich versuche, in Excel eine externe File mit Hilfe von VBA zu verarbeiten. Teilweise enthält diese File jedoch UTF-8-Daten; z. B.:

=48=61=6E=73=61=73=74=72=2E=20=31=39=0A=38=30=36=38=36=20=4D=C3=BC=6E=63=68=65=6E


Übersetzt sollte dabei folgendes herauskommen:

Hansastr. 19 80686 München
Wobei zwischen der Hausnummer und der PLZ ein CRLF (X'0A') vorhanden ist.
Es ist kein Problem für mich, die UTF8-Zeichenkette zu erkennen. Mein Problem ist nur, wie mache ich daraus einen ASCII-Text. Ich habe auch erkannt, dass das "="-Zeichen zur Trennung der einzelnen UTF-8-Werte benutzt wird. Die würde ich vorher mit der Replace-Funktion löschen.
Weder im Forum noch im Internet habe ich ein brauchbares und verständliches Beispiel gefunden.
Für ein Beispiel wäre ich sehr dankbar.
Grüße aus dem Schwabenland
Werner

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UTF-8-Code in Asci umwandeln
10.06.2016 16:04:53
Zwenn
Hallo Werner,
UTF-8 und ASCII sind in den erstn 127 Zeichen komplett identisch. Wenn Du Deine Hex-Werte nimmst und sie in Dezimal umrechnest, dann wirst Du sehen, dass dabei genau die Codes für Deine Buchstaben und Zahlen rauskommen, die Deine Adresse ergeben.
So ist Hexadezimal 48 = Dezimal 72. In einer ASCII Tabelle kannst Du nachsehen, dass das genau der Code für das große H ist (Dein erster kodierter Buchstabe). Die umgerechneten Codes kannst Du mit chr(Code) in VBA verarbeiten, um sie richtig darzustellen.
Viele Grüße,
Zwenn

Anzeige
AW: UTF-8-Code in Asci umwandeln
10.06.2016 16:35:10
Werner
Hallo Zwenn,
danke für die schnelle Antwort. Ich habe des gleich probiert, allerdings nicht mit vollem Erfolg.
Ich habe folgende Debug-Befehle probiert:
Debug.Print Chr(CDec("&H" & "4d"))
Debug.Print Chr(CDec("&H" & "C3"))
Der erste liefert das "M" von München, der zweite jedoch nicht das "ü", Aber der Hex-Wert C3 ist Dezimal 195 und damit mehr als 127. Und nun? Wie bekomme ich die deutschen Umlaute?
Gruß
Werner

Anzeige
AW: UTF-8-Code in Asci umwandeln
10.06.2016 16:48:38
Zwenn
Hallo Werner,
an das ü habe ich nicht gedacht. Das gehört natürlich nicht zum ASCII Zeichensatz. Versuche mal, deine Codes nicht mit Chr(Code) darzustellen, sondern mit ChrW(Code). ChrW mit dezimalem Code in der Klammer stellt Unicode-Zeichen dar. Außer Du arbeitest auf einem Macintosh. Da war MS wohl zu geizig, Unicode auf diese Weise zu unterstützen.
Viel Erfolg :-)
Zwenn

Anzeige
AW: UTF-8-Code in Asci umwandeln
10.06.2016 17:02:21
Werner
Hallo Zwenn,
Test leider ohne Erfolg. Nur zu Info: ich arbeite auf einem PC mit Windows 10.
Sowohl CHR(C3) als auch CHRW(C3) liefern als Ergebnis ein nicht druckbares Zeichen.
Gruß
Werner

AW: UTF-8-Code in Asci umwandeln
10.06.2016 17:05:33
Werner
Problem besteht weiterhin; habe das "Kontrollkästen" übersehen.

Anzeige
AW: UTF-8-Code in Asci umwandeln
10.06.2016 17:06:33
Zwenn
Ich nochmal.
Habe es jetzt selbst getestet und habe festgestellt, das der Code C3 nicht der UTF-8 Code für das ü ist. Der UTF-8 Code für ü lautet FC. Ich habe aber bisher nicht rausgefunden, welche Codierung bei Dir vorliegt.
Siehe hier:
http://javawiki.sowas.com/doku.php?id=java:unicode
Das Einzige, was ich auf die Schnelle gefunden habe ist ein Hinweis auf Stack Overflow, dass es sich bei C3 um eine ASCII Beschreibung für die UTF-8 Codierung handelt. Damit kann ich aber nix anfangen.
http://stackoverflow.com/questions/23009232/php-translating-c3bc-to-%C3%BC

Anzeige
Thema noch offen (k.T.)
10.06.2016 17:08:24
Zwenn
k.T.

AW: UTF-8-Code in Asci umwandeln
10.06.2016 17:16:41
Werner
Zum besseren Verständnis: bei den Daten, welche ich verarbeite, handelt es sich um VCARDs-Daten von meinem Handy. Und dort steht die Zeile so drin:
ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=48=61=6E=73=61=73=74=72=2E=20=31=39=0A=38=30=36=38=36=20=4D=C3=BC=6E=63=68=65=6E;;;;
Allerdings ohne Zeilenumbruch.
Ich hoffe noch immer, dass mir jemand helfen kann.
Werner

Anzeige
AW: UTF-8-Code in Asci umwandeln
10.06.2016 23:41:50
Planlos
Hallo
UTF-8 ist multibyte, dat heist ein Zeichen kann 1 - 4 byte beanspruchen, in deinem Fall ist das ü durch die Bytes "=C3=BC" beschrieben.
Die Wandlung kann durch die Api "MultiByteToWideChar" oder durch ein ADODB.Stream erfolgen.
Hier mal api
Declare Function MultiByteToWideChar Lib "KERNEL32.DLL" _
( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long _
) As Long
Enum CPs
CP_ACP = 0              ' default to ANSI code page
CP_OEMCP = 1            ' default to OEM  code page
CP_MACCP = 2            ' default to MAC  code page
CP_THREAD_ACP = 3       ' current thread's ANSI code page
CP_SYMBOL = 42          ' SYMBOL translations
CP_UTF7 = 65000         ' UTF-7 translation
CP_UTF8 = 65001         ' UTF-8 translation
End Enum
Function MultiByteToWide(ByRef s As String, Optional ByVal cp As Long = 65001) As String
Dim l As Long
Dim b() As Byte
If Right(s, 1)  Chr(0) Then s = s + Chr(0)
b() = s
l = MultiByteToWideChar(cp, 0, VarPtr(b(0)), UBound(b()) + 1, 0, 0)
If l Then
ReDim aWide(1 To l * 2) As Byte
l = MultiByteToWideChar(cp, 0, VarPtr(b(0)), UBound(b()), VarPtr(aWide(1)), l * 2)
MultiByteToWide = aWide()
End If
End Function
Sub ZerlegMalDeinBsp
Dim sf() As String
Dim b() As Byte
Dim i As Long
sf() = Split(Mid("=48=61=6E=73=61=73=74=72=2E=20=31=39=0A=38=30=36=38=36=20=4D=C3=BC=6E=63= _
68=65=6E", 2), "=")
ReDim b(UBound(sf))
For i = 0 To UBound(sf())
b(i) = CByte("&H" & sf(i))
Next
Debug.Print MultiByteToWide((b()))
End Sub

Anzeige
AW: UTF-8-Code in Asci umwandeln
11.06.2016 09:10:56
Werner
Hallo Planlos,

recht herzlichen Dank für das Beispiel.
ich habe es gleich ausprobiert und muss neidlos gestehen: es funktioniert super.
Ich findes es gut, wenn als Antwort imnmer ein Beispiel bereitgestellt wird, und man so die (funktionierende) Lösung nachvollziehen kann, vor Allem dann, wenn man selbst nicht das große Wissen hat.
Danke. Danke. Danke.
Gruß
Werner
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

UTF-8 in ASCII umwandeln in Excel mit VBA


Schritt-für-Schritt-Anleitung

  1. Vorbereitung der Daten: Stelle sicher, dass Deine UTF-8-Daten in einem Format vorliegen, das VBA verarbeiten kann. Zum Beispiel: =48=61=6E=73=61=73=74=72=2E=20=31=39=0A=38=30=36=38=36=20=4D=C3=BC=6E=63=68=65=6E.

  2. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Neues Modul erstellen: Klicke mit der rechten Maustaste auf „VBAProject (Deine Datei)“ und wähle „Einfügen“ > „Modul“.

  4. Code eingeben: Füge den folgenden VBA-Code ein, um die UTF-8-Zeichenkette in ASCII umzuwandeln:

    Function ConvertUTF8ToASCII(utf8String As String) As String
       Dim byteArray() As Byte
       Dim i As Long
       Dim result As String
    
       ' Ersetze "=" mit "" und teile die Zeichenkette
       utf8String = Replace(utf8String, "=", "")
       byteArray = Split(Mid(utf8String, 2), "")
    
       For i = LBound(byteArray) To UBound(byteArray)
           result = result & ChrW(CInt("&H" & byteArray(i)))
       Next i
    
       ConvertUTF8ToASCII = result
    End Function
  5. Funktion testen: Erstelle eine neue Zelle in Excel und rufe die Funktion auf, z.B.:

    =ConvertUTF8ToASCII("=48=61=6E=73=61=73=74=72=2E=20=31=39=0A=38=30=36=38=36=20=4D=C3=BC=6E=63=68=65=6E")

Häufige Fehler und Lösungen

  • Fehler: Umlaute werden nicht korrekt angezeigt: Stelle sicher, dass Du ChrW(Code) statt Chr(Code) verwendest, wenn Du mit Unicode-Zeichen arbeitest.

  • Fehler: Keine Ausgabe: Überprüfe, ob die Eingabezeichenfolge korrekt formatiert ist und keine zusätzlichen Leerzeichen oder ungültige Zeichen enthält.

  • Problem mit der Codierung: Vergewissere Dich, dass die Daten tatsächlich im UTF-8-Format vorliegen. Um sicherzustellen, dass du die richtigen Werte konvertierst, konsultiere eine ANSI-Code-Tabelle.


Alternative Methoden

  • ADODB.Stream: Eine Methode zur Konvertierung von UTF-8 in ANSI ist die Verwendung von ADODB.Stream. Hier ein Beispiel:

    Function ConvertUsingADODB(utf8String As String) As String
       Dim stream As Object
       Set stream = CreateObject("ADODB.Stream")
       stream.Type = 2 ' Text
       stream.Charset = "utf-8"
       stream.Open
       stream.WriteText utf8String
       stream.Position = 0
       stream.Type = 1 ' Binary
       ConvertUsingADODB = stream.Read
       stream.Close
    End Function
  • API MultiByteToWideChar: Eine weitere Möglichkeit ist die Verwendung der Windows-API, um UTF-8 in Unicode zu konvertieren.


Praktische Beispiele

  • Beispiel für die Verwendung von ANSI-Code: Wenn Du eine ANSI-Datei in Excel umwandeln möchtest, kannst Du die ConvertUTF8ToASCII-Funktion verwenden, um die Daten zuerst zu konvertieren, bevor Du sie in Excel importierst.

  • Umwandlung von Hex zu ASCII: Um ASCII-Code hexadezimal umwandeln zu können, kannst Du die oben erwähnte Funktion anpassen, um eine Eingabe von Hex-Werten zu akzeptieren.


Tipps für Profis

  • VBA-Fehlerbehebung: Verwende Debug.Print, um Werte während der Ausführung zu überprüfen. Dies hilft, Probleme frühzeitig zu erkennen.

  • Unicode-Zeichen im Code: Halte eine Tabelle mit ASCII- und UTF-8-Codes bereit, um schnell zu überprüfen, welche Zeichen in der Codierung verwendet werden.

  • Makros optimieren: Wenn Du häufig mit UTF-8-Daten arbeitest, erwäge, ein Makro zu erstellen, das den gesamten Prozess automatisiert.


FAQ: Häufige Fragen

1. Wie konvertiere ich UTF-8 in ANSI?
Verwende die ConvertUTF8ToASCII-Funktion, um Deine UTF-8-Zeichenkette in ASCII umzuwandeln. Achte darauf, dass Du Umlaute mit ChrW darstellst.

2. Was ist der Unterschied zwischen UTF-8 und ASCII?
UTF-8 kann mehr Zeichen als ASCII darstellen, da ASCII nur die ersten 128 Zeichen umfasst. UTF-8 kann Zeichen aus verschiedenen Sprachen und Symbolen darstellen.

3. Wie kann ich Umlaute in VBA richtig verarbeiten?
Nutze ChrW für die Darstellung von Umlauten, um sicherzustellen, dass sie korrekt angezeigt werden.

4. Warum funktioniert die Konvertierung nicht?
Überprüfe die Formatierung der Eingabedaten und stelle sicher, dass sie im richtigen Codierungsformat vorliegen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige