Entwickler-Ecke

Internet / Netzwerk - TidHTTP & Umlautproblem


sodaho - Fr 11.12.09 23:53
Titel: TidHTTP & Umlautproblem
Guten Abend,

folgendes Problem:

Für ein Onlinedatenbanktool übergebe ich per idHTTP.Post die Datensätze an die URL, die die Daten auswertet und in die Datenbank schreibt.
So weit so gut. Nur habe ich jetzt bemerkt, dass Umlaute wie ä ö ü als a o u dargestellt werden.

Was hat meine suche ergeben:

UTF8ToAnsi --> ergibt ein i mit Hausdach ein umgedrehtes Fragezeichen
HandleRedirects False/True --> Ändert nichts


Meine Frage:

Wie übergebe ich die Daten per idHTTP.Post, sodass die Umlaute korrekt auf der Website ankommen und dementsprechend in der Datenbank abgespeichert werden?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Strings := TStringList.Create;

Strings.Add('category=' + cmbcat.Text);                   //In den Kategorien sind immer Umlaute enthalten da diese immer auf Zubehör enden z.B.
Strings.Add('sonder=' + chkSonder.Hint);
Strings.Add('picture=' + picDia.FileName);
Strings.Add('productName=' + txtName.Text);
Strings.Add('productSubtitle=' + txtSubtitle.Text);
Strings.Add('productContext=' + memContext.Lines.Text);
Strings.Add('price=' + txtPrice.Text);

idHTTP.Post('http://www.domain.nic/speichern.php', Strings);


Habe die Frage auch hier gepostet: http://forum.delphi-treff.de/showthread.php?t=28007


sodaho - Di 05.01.10 01:01

Guten Abend...

So, nach einigen Tagen Abwesenheit und Unicodestudium....

...dreh ich fast durch!

Ich habe herausgefunden, was es mit Unicode auf sich hat, was die Vorteile davon sind und warum es von Vorteil sein kann dass man auf Unicode umstellt.

Das einzige was ich NICHT herausgefunden habe ist:

wie ich per TidHttp.Get oder TidHttp.Post Daten an eine URL sende die unter anderem Sonderzeichen wie "ä" "ö" "ü" beinhalten.

Kann mir bitte jemand weiterhelfen, damit wenn ich die Daten per URL sende, auch die "ä" "ö" "ü"'s (Umlaute - Sonderzeichen) beim PHP-Script ankommen?

Ich bin für jede Hilfe und jeden Tipp sehr dankbar.


FinnO - Di 05.01.10 02:02

mal stellvertretenderweise soetwas wie

Quelltext
1:
2:
3:
ü
oder
%DC


angewandt?


sodaho - Di 05.01.10 12:14

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
mal stellvertretenderweise soetwas wie

Quelltext
1:
2:
3:
ü
oder
%DC


angewandt?


Nein, bissher nur mit ü - was leider nicht funktioniert hat.

Was ist den %DC ? Weil: wenn ich das als URL sende, kriege ich ein Ü zurück :) Was ist das für eine "Zeichenzuordnung"?


Gausi - Di 05.01.10 12:24

Das ist die gängige Methode, URLs zu kodieren - der hexadezimale Code des Zeichens nach einem %. Wenn ich URLs mit Parametern aufrufe (z.B. bei Shoutcast oder LastFM), dann nutzen ich vorher so eine Funktion:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Für D2009, sonst ggf. alles *String-Gedöns durch String ersetzen.
function StringToURLString(aUTF8String: UTF8String): AnsiString;
var i: integer;
begin
    result := '';
    for i := 1 to length(aUTF8String) do
        result := result + '%'  + AnsiString(IntToHex(Ord(aUTF8String[i]),2));
end;


Das sollte dann funktionieren. Man sollte nur aufpassen, dass man die Parameter-Steuerzeichen wie %, &, ? nicht auch so maskiert. ;-)


sodaho - Di 05.01.10 12:42

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Das sollte dann funktionieren. Man sollte nur aufpassen, dass man die Parameter-Steuerzeichen wie %, &, ? nicht auch so maskiert. ;-)

Vielen vielen Dank! :-)

Gibt es ein Limit an Zeichen die per Post oder URL gesendet werden?

Damit die %, & und co nicht maskiert werden:

Bevor ich die Daten in die TSTringList lade für den TidHTTP.Post, werden die Eingaben ausgewertet. Somit wandle ich diese im selben Schritt auch gleich um, und nicht die ganze URL :D

Werde jetzt gleich noch versuchen, ob das auch per POST funktioniert.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

OK, ich löse das ganze jetzt so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
]function StringToURLString(aUTF8String: AnsiString): AnsiString;
var i: integer;
begin
    result := '';
    for i := 1 to length(aUTF8String) do
        result := result + '%'  + AnsiString(IntToHex(Ord(aUTF8String[i]),2));
end;


Wobei ich aUTF8String: UTF8String mit AnsiString ersetzt habe. (1) Delphi 2009 gibt nun keine Warnhinweise mehr aus 2) Das PHP Script mit dem ich die Daten empfange und verarbeite reicht nun aus wenn ich da URLDecode($_POST['variable'] nur einmal verwende statt zwei mal :).

Vielen Dank für die Hilfe und Tipps! Ich bin grad unglaublich Glücklich :)

Einen wunderschönen Tag wünsch ich euch allen. Grüssle SoDaHo

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.

Edit:

Ich korrigiere. Mit AnsiString werden logischerweise MEHR Warnhinweise ausgegeben.

So ist der "richtige" Code.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
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;