Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TIdHTTP.Post / PHP / Umlaute in Formulardaten (https://www.delphipraxis.net/154322-tidhttp-post-php-umlaute-formulardaten.html)

kriegste 6. Sep 2010 16:27

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:
<?php
echo $_POST["test"];
?>
[edit=Matze][delphi]- und [php]-Tags eingefügt. Zukünftig bitte selbst daran denken. MfG Matze[/edit]

generic 6. Sep 2010 16:29

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?

kriegste 6. Sep 2010 18:33

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.

Bernhard Geyer 6. Sep 2010 18:53

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten
 
Wie schauen die fehlerhaften Daten überhaupt aus?
ich würde testhalber die Daten UTF8-Codiert hochschicken.

kriegste 6. Sep 2010 21:06

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;

Valle 6. Sep 2010 21:27

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:
header('Content-Type: text/html; charset=utf-8');

echo $_POST['daten'];
Statt des Header-Aufrufs, kann man bei Apache-Servern auch eine Datei namens .htaccess anlegen und mit folgendem Inhalt versehen:

Code:
AddDefaultCharset utf-8
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.

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

kriegste 6. Sep 2010 21:39

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...

kriegste 6. Sep 2010 22:59

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 23:05 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