Autor Beitrag
sodaho
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 11.12.09 23:53 
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?


ausblenden 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: forum.delphi-treff.d...owthread.php?t=28007
sodaho Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 05.01.10 02:02 
mal stellvertretenderweise soetwas wie
ausblenden Quelltext
1:
2:
3:
ü
oder
%DC


angewandt?
sodaho Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 05.01.10 12:14 
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
mal stellvertretenderweise soetwas wie
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:
ausblenden 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. ;-)

_________________
We are, we were and will not be.
sodaho Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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:

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

ausblenden 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;