AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TIdHTTP.Post / PHP / Umlaute in Formulardaten
Thema durchsuchen
Ansicht
Themen-Optionen

TIdHTTP.Post / PHP / Umlaute in Formulardaten

Ein Thema von kriegste · begonnen am 6. Sep 2010 · letzter Beitrag vom 6. Sep 2010
Antwort Antwort
kriegste

Registriert seit: 9. Jul 2006
25 Beiträge
 
#1

TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 17:27
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]

Geändert von Matze ( 6. Sep 2010 um 19:29 Uhr)
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#2

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 17:29
Dein Beispielcode enthält keine Header zum Encoding.
Was setzt du denn so in Delphi und in der PHP Response?
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
kriegste

Registriert seit: 9. Jul 2006
25 Beiträge
 
#3

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 19:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 19:53
Wie schauen die fehlerhaften Daten überhaupt aus?
ich würde testhalber die Daten UTF8-Codiert hochschicken.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
kriegste

Registriert seit: 9. Jul 2006
25 Beiträge
 
#5

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 22:06
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;
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#6

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 22:27
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 ), 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
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
kriegste

Registriert seit: 9. Jul 2006
25 Beiträge
 
#7

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 22:39
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...

Geändert von kriegste ( 6. Sep 2010 um 22:44 Uhr)
  Mit Zitat antworten Zitat
kriegste

Registriert seit: 9. Jul 2006
25 Beiträge
 
#8

AW: TIdHTTP.Post / PHP / Umlaute in Formulardaten

  Alt 6. Sep 2010, 23:59
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;
  Mit Zitat antworten Zitat
Alt 13. Sep 2010, 05:23     Erstellt von fgreen
Dieser Beitrag wurde von mkinzler gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 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