Konvertierung von ISO-8859-1 nach UTF-8

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Konvertierung von ISO-8859-1 nach UTF-8

Beitrag von Martin Altmann »

Moins,
ich habe ein kleines Problem:
Ich habe in meinen Web-Seiten (Kodierung: ISO-8859-1) Feldinhalte aus Formularen, die auch Sonderzeichen (Umlaute) anthalten können.
Diese soll ich an eine andere Webseite posten, die die Daten in der Kodierung UTF-8 erwartet - Feldinhalte mit Umlauten werden in diesem Fall ignoriert (ungültige Zeichen).
Wie kann ich die Daten so umwandeln, dass sie als UTF-8 rübergehen? Die Headerangaben habe ich beim Senden eigentlich auf UTF-8 (content-type: text/html; charset=UTF-8 ) gesetzt...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

ich habe irgendwann mal im Alaska-Forum Code gepostet, der das tut... laß mich kurz nachschauen wann und wo.

Viele Grüße,
Günter
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

Irrtum meinerseits, der Post ging um die Konvertierung UTF-8 -> Ansi.
Ich werde das gleich mal vom Kopf auf die Füße stellen...

Günter
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

dies sollte es tun.

Code: Alles auswählen

#include "dll.ch"

#DEFINE CP_UTF8 65001 // UTF-8-Codepage
#define CP_ACP  0  // aktuelle System-Codepage annehmen

FUNCTION AnsiToUTF8( cAnsiString )

LOCAL nSize, cBuffer, cUTF8

STATIC cMBtoW, cWToMB

IF cMBtoW = NIL
	cMBtoW := DllPrepareCall( "kernel32.dll", DLL_STDCALL, "MultiByteToWideChar" )
	cWToMB := DllPrepareCall( "kernel32.dll", DLL_STDCALL, "WideCharToMultiByte" )
ENDIF

cAnsiString += chr(0)

// Ansi in UTF-16 umwandeln
nSize   := DllExecuteCall( cMBtoW, CP_ACP, 0, cAnsiString, -1, 0, 0 )
cBuffer := replicate( chr(0), 2*(nSize + 1) )
DllExecuteCall( cMBtoW, CP_ACP, 0, cAnsiString, -1, @cBuffer, nSize+1 )

// UTF-16 in UTF-8 umwandeln
nSize   := DllExecuteCall( cWToMB, CP_UTF8, 0, cBuffer, -1, 0, 0, 0, 0 )
cUTF8   := replicate( chr(0), nSize + 1 )
DllExecuteCall( cWToMB, CP_UTF8, 0, cBuffer, -1, @cUTF8, nSize+1, 0, 0 )

RETURN left( cUTF8, nSize - 1 )
Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
vielen Dank für Deine Lösung!
Leider funktioniert sie in meinem Fall nicht richtig - PayPal zeigt die Daten nicht korrekt an :roll:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin.

funktioniert es denn mit dem String, den du zu konvertieren hast, lokal auf deinem System? Verwendet der zu konvertierende String eventuell eine andere Zeichenkodierung als die, welche auf der ausführenden Maschine als Standard eingerichtet ist?

(um UTF-8 zu betrachten, verwende ich lister.exe, Bestandteil von Total Commander)

Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
kann ich Dir leider icht sagen.
Das kommte raus, wenn ich Dein Programm teste:

Code: Alles auswählen

Mäöürtín     // geht rein
Mäöürtín  // kommt raus
Merkwürdigerweise kommt das bei PayPal aber so auch in den SLEs an, wie Deine Funktion das umwandelt.
Gebe ich dagegen die Daten direkt (in ANSI) an PayPal, meckert PayPal und sagt, dass einzelne Felder ungültige Zeichen enthalten - diese Felder bleiben dann leer.
Schaue ich mir den Source der PayPal-Seite an, so ist überall von charset=UTF-8 die Rede...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

ich meine, die Ausgabe in deinem Beispiel ist gültiges UTF-8. Hat du den vorletzten Buchstaben, das "i", absichtlich mit accent aigu geschrieben ?

Mäöürtín

Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
ja - habe ich. Wollte einfach Sonderzeichen testen...
Ich habe auch nicht geglaubt, dass Deine Routine fehlerhaft ist, keine Sorge!
Nun denn, dann werde ich noch ein wenig stöbern, ob ich bei PayPal noch was finde...
Wenn nicht, müssen die Leute mit Sonderzeichen halt ihre Daten bei PayPal erneut eingeben - auch nicht soooo schlimm.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

vielleicht hilft es, die HTTP POST-Daten in eine Datei zu schreiben und dann mal zu schauen, was tatsächlich übertragen werden soll.

Eine andere Idee wäre, statt der Konstanten CP_ACP die Konstante CP_THREAD_ACP (Wert=3) zu probieren.

Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
das hat leider auch nichts genützt - ich gebe es jetzt erstmal auf, ist nicht sooo wichtig...

Vielen Dank für Deine Unterstützung,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 393
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Armin »

Hi Martin,

warum arbeitest Du dann nicht mit den &uUml; usw.?

Grüsse Armin
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Allo Armin,
zu umständlich! Ich müsste alle Eingaben in den betreffenden Feldern analysieren und durch die entsprechenden HTML-Tags ersetzen - und bei der Masse an Möglichkeiten würde das ein wenig dauern...
Und nicht jedes Sonderzeichen hat einen entsprechen HTML-Tag!!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten