![]() |
TIdHTTP.Post / PHP / Umlaute in Formulardaten
Hallo,
ich nutze D6 und Indy 10 (neuer Snapshot) und möchte Formulardaten per Post abschicken und mit einem PHP-Script empfangen. Es bereiten mir u.a. Umlaute Probleme. Diese kommen nicht korrekt im PHP-Script an. Ich lasse das PHP-Script der Einfachheit halber die Daten wieder an die Delphi-Anwendung zurückschicken. Allerdings würde auch PHP den gelieferten Text fehlerhaft in eine Datei schreiben (es liegt also nicht am Zurückschicken der Datei). Anbei meine Versuche. Der jeweils zurückgegebene String steht hinter dem Kommentar. Da sollte selbstverständlich ä stehen, wenn alles korrekt wäre. Wo stehe ich auf dem Schlauch? ---
Delphi-Quellcode:
---
sl:= TStringList.Create;
try sl.Add('test=ä'); try ShowMessage(HTTP.Post('http://localhost/test.php', sl)); // a except end; finally FreeAndNil(sl); end;
Delphi-Quellcode:
---
ds:= TIdMultipartFormDataStream.Create;
try ds.AddFormField('test', 'ä'); try ShowMessage(HTTP.Post('http://localhost/test.php', ds)); // =E4 except end; finally FreeAndNil(ds); end;
PHP-Quellcode:
[edit=Matze][delphi]- und [php]-Tags eingefügt. Zukünftig bitte selbst daran denken. MfG Matze[/edit]
<?php
echo $_POST["test"]; ?> |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
Dein Beispielcode enthält keine Header zum Encoding.
Was setzt du denn so in Delphi und in der PHP Response? |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
HTTP.Request.ContentType:= 'multipart/form-data';
Aber ob mit oder ohne machte keinen Unterschied. Sobald ich ein Charset setze, kommt übrigens beim PHP-Script nichts mehr an. |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
Wie schauen die fehlerhaften Daten überhaupt aus?
ich würde testhalber die Daten UTF8-Codiert hochschicken. |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
Wie gesagt, die fehlerhaft zurück gelieferten Daten habe ich oben mal mit reinkommentiert.
UTF-8 hatte ich auch probiert, und zwar u.a. so. Leider auch ohne den gewünschten Erfolg.
Code:
var
ds: TIdMultipartFormDataStream; ms: TMemoryStream; s: UTF8String; begin HTTP.Request.ContentType:= 'multipart/form-data'; ds:= TIdMultipartFormDataStream.Create; ms:= TMemoryStream.Create; try s:= utf8encode('ä'); if s <> '' then ms.Write(s[1], Length(s)); ds.AddObject('test', 'text/plain', 'UTF-8', ms); try ShowMessage(HTTP.Post('http://localhost/test.php', ds)); // a (nach utf8_decode in php) except end; finally FreeAndNil(ds); FreeAndNil(ms); end; end; |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
Hallo,
ob dein Delphi-Code korrektes UTF-8 sendet weiß ich nicht, dass muss dir jemand anderes sagen. Gehen wir aber mal davon aus, dann sollte folgender PHP-Code Abhilfe schaffen:
PHP-Quellcode:
Statt des Header-Aufrufs, kann man bei Apache-Servern auch eine Datei namens .htaccess anlegen und mit folgendem Inhalt versehen:
header('Content-Type: text/html; charset=utf-8');
echo $_POST['daten'];
Code:
Denke einfach immer daran, eine Informations-Kette zu erstellen. Jedes beteiligte Element dieser Kette muss den Charset direkt oder indirekt wissen. Delphi kodiert die Daten als UTF-8 und sendet diese (mit entsprechender Markierung!!) an PHP. PHP weiß dann zwar, dass es sich um UTF-8 handelt, aber der Browser weiß das nicht. Also muss auch der via HTTP-Header informiert werden.
AddDefaultCharset utf-8
Noch ein kleines Experiment: Bei kaputtem Charset im Firefox unter Ansicht -> Zeichenkodierung mal einen anderen Charset auswählen. Sofern man nicht irgendwas kaputt-kodiert hat (utf8_decode :roll: ), hat man damit das Problem meist schon identifiziert. Man sieht also, dass lediglich dem Browser die Kenntniss über den richtigen Zeichesatz fehlt. :-) Liebe Grüße, Valle Liebe Grüße, Valle |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
Ohne utf8_decode(), wie in meinem Beispiel und dafür mit deinem Header passiert genau das Gleiche:
äöüß wird zu aou? Edit: Ah, aber immerhin speichert PHP jetzt korrekt ab, wenn ich die Daten in ein Textfile schreiben lasse. Danke! Die Rückgabe will ich jetzt aber trotzdem noch hinkriegen... |
AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
Lösung sieht jetzt so aus
Code:
<?php
header('Content-Type: text/html; charset=UTF-8'); echo $_POST["test"]; ?>
Code:
var
ds: TIdMultipartFormDataStream; ms: TMemoryStream; s: String; begin ds:= TIdMultipartFormDataStream.Create; ms:= TMemoryStream.Create; try s:= 'äöüß'; if s <> '' then ms.Write(s[1], Length(s)); ds.AddObject('test', 'text/plain', '', ms); try HTTP.Post('http://localhost/test.php', ds, ms); SetLength(s, ms.Size); ms.Read(s[1], ms.Size); ShowMessage(s); except end; finally FreeAndNil(ds); FreeAndNil(ms); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz