Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Seite 1 von 2  1 2      

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