Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   UTF8 Sonderzeichen Problem (https://www.delphipraxis.net/172542-utf8-sonderzeichen-problem.html)

Chriscode 9. Jan 2013 18:00

Delphi-Version: 5

UTF8 Sonderzeichen Problem
 
Hallo zusammen,
ich stehe jetzt seit Stunden vor folgendem Problem und komme einfach nicht weiter:
Über die idhttp Komponente erhalte ich eine Rückgabe im UTF8 Format. Diese verarbeite ich programmintern mit UTF8ToString. Sämtliche Sonderzeichen und Umlaute funktionieren nun, jedoch nicht das scharfe s "ß".

Wenn ich mir die Ausgabe in eine Datei geben lasse und das Zeichen im Notepad++ als Ansi ansehe, zeigt er mir ein großes A mit Tilde an. Auch der Notepad++ Editor kann dieses nicht korrekt im UTF8 Modus darstellen. Wenn ich mir das Zeichen per Hex ansehe kommt ein C3 zum Vorschein. Gemäß dieser Tabelle ist dies ebenfalls das große A mit Tilde.

Meine Frage ist jetzt, wie ich dieses Zeichen in Delphi ersetzen kann? Folgendes hat nicht funktioniert:
Code:
StringReplace(response,'Ã','a',[rfReplaceAll]);
Über diese Frage habe ich noch folgende Version erfolgslos probiert:
Code:
StringReplace(newStr,#$195,'',[rfReplaceAll]);
Möglicherweise ist dies ein ähnliches Problem wie hier? http://www.delphipraxis.net/131772-f...ortstring.html

Bitte helft mir, ich bin am verzweifeln :cry:

Gruß
Chris

DeddyH 9. Jan 2013 18:20

AW: UTF8 Sonderzeichen Problem
 
Du weist das Ergebnis aber wieder Response zu, oder?

Bernhard Geyer 9. Jan 2013 18:27

AW: UTF8 Sonderzeichen Problem
 
%C3 ist nicht die UTF8-Codierung von ß.
%C3 %9F ist die UTF8-Coierung.
In den Quelldaten muss nach dem %C3 also noch ein %9F folgen. Falls nicht hat der erzeuger der Datei mißt gebaut oder die Datei ist währen der Übertragung verlustig gegangen.

Chriscode 9. Jan 2013 20:03

AW: UTF8 Sonderzeichen Problem
 
Besten Dank für eure schnellen Antworten.

Zitat:

Zitat von DeddyH (Beitrag 1198419)
Du weist das Ergebnis aber wieder Response zu, oder?

Ja, aber danke für den Hinweis. Den Fehler hatte ich in der Vergangenheit schon einmal :roll:

Zitat:

Zitat von Bernhard Geyer (Beitrag 1198420)
%C3 ist nicht die UTF8-Codierung von ß.
%C3 %9F ist die UTF8-Coierung.
In den Quelldaten muss nach dem %C3 also noch ein %9F folgen. Falls nicht hat der erzeuger der Datei mißt gebaut oder die Datei ist währen der Übertragung verlustig gegangen.

Dies könnte durchaus sein. Wäre %C3 dann dieses A mit Tilde? Wenn ich dies im Hex Editor richtig sehe, ist in der Response ein "C3 3F". Demnach hat der Datenbereitsteller mgölicherweise irrtümlich statt 6F ein 3F gewählt?

Aber ich weiß offen gesagt auch garnicht, wie ich diesen Hex ersetzen mittels Stringreplace ersetzen könnte? Und wie ich die Response genau analysieren kann ist mir auch nicht klar...


Gruß
Chris

Bernhard Geyer 9. Jan 2013 20:38

AW: UTF8 Sonderzeichen Problem
 
Zitat:

Zitat von Chriscode (Beitrag 1198425)
Wenn ich dies im Hex Editor richtig sehe, ist in der Response ein "C3 3F". Demnach hat der Datenbereitsteller mgölicherweise irrtümlich statt 6F ein 3F gewählt?

%3F = "?". Und ein Fragezeihen ist eigentlich ein Zeichen dafür das irgendwas mit Zerschossen wurde. %9F wurde fehlerhaft nach %3F gewandelt. Tritt auf wenn versehentlich der UTF8-String in einen ASCII-String gewandelt wird und bei der Wandlung %9F als Fallback in ein Fragezeichen gewandelt wird.

Chriscode 9. Jan 2013 21:12

AW: UTF8 Sonderzeichen Problem
 
erneut vielen Dank für die schnelle Antwort.

Nehmen wir einmal an dies wäre so. Wie kann ich dann "%C3%9F" bzw "%C3%3F" in das eigentlich beabsichtigte ß verwandeln?

Oder genauer gesagt: Ich suche wie bereits erwähnt einen Weg um diese fehlerhaften Zeichen im gesamten String durch die richtigen zu ersetzen. Also z.B. eine Stringreplace Variante wie im Ausgangspost.

Nur weiß ich nicht wie ich den String auf Vorkommnisse dieser Art prüfen kann?

Gruß
Chris

jfheins 9. Jan 2013 21:24

AW: UTF8 Sonderzeichen Problem
 
Zu dem zeitpunkt wo schon ? in dem text verteilt sind ist es schon zu spät!
Anstatt nachträglich irgendwelche Zeichen zu ersetzten solltest du irgendwie früher anpacken und es gleich richtig dekodieren. Zeig' mal ein bisschen Quelltext.
Und noch viel besser: Falls du sie 'rausgeben darfst wäre die URL der Seite auch praktisch um das mit der "falschen Kodierung" nachzuvollziehen.

Woher nimmst du eigentlich UTF8toString? Dein Delphi5 dürfte das ja nicht kennen. Hierher? http://stackoverflow.com/questions/7...elphi-versions Dann müsste da aber auch ein WideString raus kommen.
Oder warst du der, der Lazarus verwendet? Wenn ja, bitte dazu schreiben ;-)

Chriscode 10. Jan 2013 09:16

AW: UTF8 Sonderzeichen Problem
 
Das Problem ist, dass es sich um Contentdaten handelt, dessen Zugang wir bezahlen müssen. Demnach darf ich die Zugangsdaten oder die Response wohl nicht einfach herausgeben.

Mein Ansatz nur diesen Fehler zu beheben kam daher, da sonst alles richtig konvertiert wird.

Datenquelle ist eine xml rss Datei:
Zitat:

<?xml version='1.0' encoding='UTF-8'?>
Quelltext ist halt einfach:
Code:
response:=idhttp1.get('url');
responsecon:=UTF8ToString(response);
Und jetzt wäre meine Idee gewesen, diese fehlerhaften Zeichen bereits vor UTF8ToString zu ersetzen. z.B. mit Stringreplace.

PS: Ich nutze natürlich kein Delphi5 mehr sondern Delphi XE. Delphi 5 dürfte ja mittlerweile schon über 10 Jahre alt sein? Leider habe ich die Angabe beim Topic erstellen in der Hektik übersehen, Verzeihung :oops:

EDIT: Problem gelöst.
Der Fehler war, dass die idhttp Komponente den Code trotz richtig gesetzten charset zerstückelt hat (zumindest beim ß). Ich habe idhttp nun direkt in einen TMemorystream ausgeben lassen und dann UTF8ToString eingesetzt und es scheint zu funktionieren.

Gruß
Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz