Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy idHTTP Probleme mit Umlaute (https://www.delphipraxis.net/172719-indy-idhttp-probleme-mit-umlaute.html)

Cyberaxx 18. Jan 2013 21:48

Indy idHTTP Probleme mit Umlaute
 
Delphi 2010
Indy 10.5.9.4797

Hallo,

habe da ein hoffentlich kleine Problem mit der Komponente idHTTP und den lieben Umlauten. Diese werden bei mir mit einem ? ersetzt bei der Ausgabe.

Ausgabe im folgenden Beispiel:
Code:
???
Delphi-Quellcode:
function StringToURLString(aUTF8String: String): String;
  var
    I: Integer;
begin
  Result := '';
  for I := 1 to length(aUTF8String) do
    Result := Result + '%' + String(IntToHex(Ord(aUTF8String[i]),2));
end;

procedure TForm7.Button1Click(Sender: TObject);
  var
    Daten: TIdMultiPartFormDataStream;
    Content: string;
    URL: string;
begin
  Daten := TIdMultiPartFormDataStream.Create;
  try
    Daten.AddFormField('test', StringToURLString('öäü -- ÖÄÜ'));
    try
      URL := Format('%s?version=%s&test=%s', [edtHost.Text, edtVersion.Text, StringToURLString('ÖÄÜ')]);
      IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
      //idHTTP1.Request.ContentType:= 'multipart/form-data';
      //Content := UTF8ToUnicodeString(IdHTTP1.Post(URL, Daten));
      Content := IdHTTP1.Post(URL, Daten);
      EmbeddedWB1.LoadFromString(Content);
    except
      on E: Exception do
        ShowMessage('Fehler: ' + #13#10 + E.Message);
    end;
  finally
    Daten.Free;
  end;
end;
Der entsprechende PHP Teil:
Code:
header('Content-Type: text/xml');  
$Entry2 = urldecode($_GET['test']); echo $Entry2; die('');
Rufe ich im Browser direkt http://192.168.11.10/web/apiPostTest...test=%D6%C4%DC aud bekomme ich ÖÄÜ Angezeigt. Nur die Http Komponente macht daraus eben ???

Nutze ich hingegen noch einmal URLEncode dazu dann bekomme ich im Browser folgendes %C3%84%C3%96%C3%9C. Von der HTTP Komponente dagegen %D6%C4%DC

Bei einem Bekannten ebenfalls D2010 und den Indies die bei Delphi im Standard kommen klappt es ohne Probleme rein mit dem URLDecode seitens PHP.
Ist da vielleicht der Wurm in der Indy zu suchen? Bzw hat jemand schon einmal das Problem gehabt und kennt eine Lösung?

mjustin 18. Jan 2013 21:58

AW: Indy idHTTP Probleme mit Umlaute
 
Ich sehe im Client - Code zwei Stellen, in denen Umlaute verwendet werden: einmal als Form Parameter und einmal als Request Parameter. Ich würde das Beispiel vereinfachen und reduzieren auf einen der beiden Parameter. Beide haben den Parameternamen 'test'. Die PHP Seite greift vermutlich (!) auf den GET Parameter zu. Also könnte man den gesamten Code für den Form.Parameter entfernen.

Cyberaxx 18. Jan 2013 22:03

AW: Indy idHTTP Probleme mit Umlaute
 
Das war nur zum Testen ob es bei GET anders läuft. Eigentlich sollte das ganze über POST geregelt werden.
Im PHP Teil lese ich ja auch nur das GET aus. Lege ich es um auf POST habe ich allerdings das selbe Ergebnis.
Anfangs war es eben nur POST. So kann ich es aber im Webbrowser nach prüfen :)

geskill 18. Jan 2013 22:12

AW: Indy idHTTP Probleme mit Umlaute
 
Hallo Cyberaxx,
wandle niemals Umlaute oder irgendwelche Zeichen in der Indy HTTP Komponente manuell um. Die kann das ganz alleine.

1. Für die URL Zeile gibt es die wunderbare Funktion HTTPEncode() aus der Unit HTTPApp.

2. Bei AddFormField wählst du ein CharSet, dadurch weiß die Komponente genau wie sie es zu kodieren hat.

Delphi-Quellcode:
var
     Daten: TIdMultiPartFormDataStream;
     Content: string;
     URL: string;
begin
   Daten := TIdMultiPartFormDataStream.Create;
   try
     Daten.AddFormField('test', 'öäü -- ÖÄÜ', 'UTF-8').ContentTransfer := 'binary';
     try
       URL := Format('%s?version=%s&test=%s', [edtHost.Text, HTTPEncode(edtVersion.Text), HTTPEncode('ÖÄÜ')]);

       IdHTTP1.Request.ContentType := 'multipart/form-data';

       Content := IdHTTP1.Post(URL, Daten);

       EmbeddedWB1.LoadFromString(Content);
     except
       on E: Exception do
         ShowMessage('Fehler: ' + #13#10 + E.Message);
     end;
   finally
     Daten.Free;
   end;
Gerne kannst du dir auch mein Tutorial ansehen:
http://www.delphipraxis.net/160152-i...protokoll.html


EDIT: Hab die Parameterreihenfolge korrigiert :)

EDIT2: HTTPEncode(...) wendet man natürlich nur auf den GET-Parameterteil in der URL an.

EDIT3: Wo ich gerade dabei bin; application/x-www-form-urlencoded benutzt man bei TIdMultiPartFormDataStream nicht.

Cyberaxx 18. Jan 2013 22:29

AW: Indy idHTTP Probleme mit Umlaute
 
Also wenn ich dein Beispiel nutze mit POST dann bekomme ich unter $_POST['test'] -> text/plain

Werde es mir mal ansehen

Cyberaxx 18. Jan 2013 22:35

AW: Indy idHTTP Probleme mit Umlaute
 
hm.. Sollte da nicht ein roter Kasten kommen?

Na auch wenn ich die Reihenfolge ändere bekomme ich nicht das gewünschte Ergebnis

Wenn ich Content := IdHTTP1.Post(HTTPEncode(URL), Daten); das versuche dann motzt die Koponente mit Unknown Protocol.
Wenn ich nur ab dem ? das HTTPEncode nutze motzt er an einer anderen stelle mit HTTP/1.1 404

geskill 18. Jan 2013 22:42

AW: Indy idHTTP Probleme mit Umlaute
 
Ich bin auch nicht ganz auf der Höhe heute Abend :/

Also HTTPEncode(...) wendet man natürlich nur auf den GET-Parameterteil in der URL an. (Weil sonst HTTPEncode :// umwandelt ;) )

Ich muss schon zugeben, dein Format() hat mich bisschen verwirrt. Ich habe meinen Beitrag oben korrigiert.

Cyberaxx 18. Jan 2013 22:56

AW: Indy idHTTP Probleme mit Umlaute
 
Es war mal eben auf die schnelle dahin gesaut....

Ich habe bereits die Anwendung am laufen bis dato noch via GET und wollte es auf POST umstellen da auch Profil Bilder übertragen werden.
Vor zwei Tagen ist es mir bei dem vorhandenen Projekt aufgefallen das in der Datenbank anstatt Günny -> G?nny steht und das sah mir ein wenig komisch aus.

Seit dem Fummel ich da rum...

Was mich wundert ist ja bei D2010 standard Indy klappts... und das ist die 10.5.5

Wichtig ist ja auch erst einmal den Content ins richtige Format zu bekommen. Auf PHP Seite kommt ja das richtige an nur es gelant nicht in meinen Content.

geskill 18. Jan 2013 23:05

AW: Indy idHTTP Probleme mit Umlaute
 
Also wenn es jetzt noch nicht klappt, dann arbeitet deine Webseite vielleicht nicht mit UTF-8, dann müsstest du es mal mit ISO-8859-1 probieren.

Im Quellcode jeder Webseite steht folgendes:
Code:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
Darüber findest du es i.d.R. heraus.

Jep bei den Indys gibt es von Version zu Version große Unterschiede (jedenfalls bei der TIdHTTP Komponente).

Cyberaxx 18. Jan 2013 23:32

AW: Indy idHTTP Probleme mit Umlaute
 
Den Quelltext von der PHP Seite war soweit vollständig. Da ist kein HTML enthalten. Eigentlich ist es so das als Ausgabe eine XML erzeugt wird die ich dann auslese. Also nix mit dem ganzen HTML gedöns :)

Ich mache eigentlich nichts andere als eine Seite aufzurufen index.php?version=1.0.0 und per POST dann sagen hole mir alle aktiven Moderatoren.

Es sei denn ich irre mich und ich muss denonch den Header angeben...

Code:
header('Content-Type: text/xml');  
echo '<?xml version="1.0" encoding="UTF-8"?><api>Content vom Script oder DB oder sonst wo</api>';
Folglich gebe ich ja sozusagen UTF-8 vor? ich probiere es aber mal mit ISO

Cyberaxx 18. Jan 2013 23:35

AW: Indy idHTTP Probleme mit Umlaute
 
Egal wie ich es dreh oder wende... es bleibt bei ???

geskill 19. Jan 2013 00:02

AW: Indy idHTTP Probleme mit Umlaute
 
Achso. Den PHP-fetzen habe ich übersehen.

Probier mal diesen Header Befehl:
Code:
header('content-type: text/html; charset: utf-8');
Und ich weiß ja nicht wie dein Server konfiguriert ist, aber dort gibt es auch diverse Einstellungen z.B.:
Code:
php.ini contents
default_charset = "utf-8"
Das funktioniert im Browser auch nur, weil der auch "scheiße frisst", sprich auch falsch "programmierte/konfigurierte" Webseiten/Server erkennt und es trotzdem für den Benutzer richtig darstellt.

Der Fehler liegt jetzt irgendwo an der "Webseite" und nicht an Indy.

Die PHP-Datei ist auch als UTF-8 Datei abgespeichert?

Also da gibt es noch zig-Möglichkeiten woran es liegt, aber dahingehend weiß ich auch nicht alles. Aber der Fehler liegt irgendwo zwischen "eben auf die schnelle dahin gesaut" und der Uhrzeit ;)

Cyberaxx 19. Jan 2013 07:32

AW: Indy idHTTP Probleme mit Umlaute
 
Guten Morgen,

nun hat es sich aufgelöst... Laut PHPInfo war kein default_charsetz eingestellt. Hab es jetzt auf UTF-8 gesetzt und siehe da es läuft.
Von der Seite hatte ich das gestern nicht mehr betrachtet.

Nun brauche ich auf PHP Seite auch nicht mehr das URLEncode.
Perfekt ich danke für die Hilfe, gerade um die Uhrzeit


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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