HTTP - URLEncode

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: HTTP - URLEncode

BeitragSa, Jun 02, 2012 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich stehe grad in einer Krise und will mal wieder meinen Rechner aus dem Fenster schmeißen. Ich schicke einen HTTP Request an meinen Server. Diese Request beinhaltet Sonderzeichen wie z.B. ein "Ö". Um diese Sonderzeichen sicher zum Server zu bringen, verwende ich folgende Funktion:
BlitzMax: [AUSKLAPPEN]
	Function URLEncode:String(str:String)
Local ret:String

For Local i:Int = 0 Until str.Length
Local c:String = str[i..i + 1]
Local ascii:Int = Asc(c)
If (ascii >= 0 And ascii <= 31) Or (ascii >= 127 And ascii <= 255) Then
Local hexstr:String = Hex(ascii)
Local newhexstr:String = "%" + hexstr[hexstr.Length - 2..hexstr.length]
ret:+newhexstr
Else
c = Replace(c, " ", "%20")'
c = Replace(c, "!", "%21")
c = Replace(c, Chr(34), "%22")
c = Replace(c, "#", "%23")'
c = Replace(c, "$", "%24")'
c = Replace(c, "%", "%25")'
c = Replace(c, "&", "%26")'
c = Replace(c, "+", "%2B")'
c = Replace(c, ",", "%2C")'
c = Replace(c, "/", "%2F")'
c = Replace(c, ":", "%3A")'
c = Replace(c, ";", "%3B")'
c = Replace(c, "<", "%3C")'
c = Replace(c, "=", "%3D")'
c = Replace(c, ">", "%3E")'
c = Replace(c, "?", "%3F")'
c = Replace(c, "@", "%40")'
c = Replace(c, "[", "%5B")
c = Replace(c, "\", "%5C")
c = Replace(c, "^", "%5E")
c = Replace(c, "]", "%5D")
c = Replace(c, "`", "%60")
c = Replace(c, "{", "%7B")
c = Replace(c, "|", "%7C")
c = Replace(c, "}", "%7D")
c = Replace(c, "~~", "%7E")
ret:+c
EndIf
Next

Return ret
End Function


Aus meinen "Ö" wird jetzt "%D6". Wenn mein Server jetzt diesen Request bekommt, und cih versuche die Daten aus dem Request zu verarbeiten, dann kotzt er mich regelrecht mit Fehlern voll. Also habe ich mich schlau gemacht und mal geguckt was Firefox denn aus diesen "Ö" macht, und sieh da nix mit "%D6". Firefox macht daraus ein "%C3%96". Wie kommt Firefox darauf? Ich hab schon im Internet gesucht, jedoch habe ich keine Methode gefunden die das selbe Ergebnis wie Firefox bekommt. Ich bin ein wenig am verzweifeln, weil ich diese doofe "Ö" und auch die anderen Sonderzeichen zum Server bekommen muss, ohne dass mir dieser Fehler ausgibt.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Jolinah

BeitragSa, Jun 02, 2012 1:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Eisvogel,

Deine Funktion wandelt die Zeichen basierend auf ASCII um. %C3%96 ist die Unicode/UTF8-Repräsentation mit 2 Bytes für ein Zeichen. Man müsste also "einfach" die 2 Bytes eines Zeichens nehmen und diese Bytes in Hex umwandeln. In der Praxis ist es wohl in BMax etwas schwieriger.

Allerdings versteh ich nicht ganz wieso das beim Server nicht auch mit %D6 klappen sollte, aber das hängt wohl letztlich auch von der Server-Software ab. Machst du einen POST- oder GET-Request?

Bei POST müsste das ja ungefähr so aussehen:

Code: [AUSKLAPPEN]
param1=%D6sterreich&param2=abc


Und dann in PHP z.B.

Code: [AUSKLAPPEN]
$param1 = urldecode($_POST['param1']);


Falls das PHP nicht sowieso schon decodiert in $_POST ablegt.

Der Eisvogel

BeitragSa, Jun 02, 2012 8:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Jolinah,

ok, PHP legt die Daten immer schon decodiert ab. Was mich eben auch wundert, dass der Server das nicht aktzeptiert. Woher weiß Firefox, dass der Server das ganze in UTF8 habe will? Oder ist das irgendwie genormt, dass man HTTP Requests mit UTF8 macht?
Zur Frage ob mit GET oder POST, bei beiden klappt es mit %D6 nicht. Es kommen immer kryptische Zeichen an, die der Server, frag mich nicht warum, nicht verarbeiten kann, und schon garnicht in eine Datenbank eintragen kann, obwohl der String escaped wurde.

Naja, ich mach mich jetzt mal schlau wie ich von ASCII zu UTF8 komme, und vielleicht wird ja dann irgendwann aus meinem "Ö" ein "%C3%96".

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

jsp

BeitragSa, Jun 02, 2012 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Naja, ich mach mich jetzt mal schlau wie ich von ASCII zu UTF8 komme...

Blitzmax hat ja String.FromUTF8String() und ToUTF8String()
Kann mich dunkel daran erinnern das FromUTF8String als Methode einfach den String umwandelt aber ToUTF8String wird glaub ich nur intern benutzt, aber du könntest dir ja den code raussuchen.

Ein URL Encode und Decode gibt es auch hier:
http://www.blitzmax.com/codear...code=1581.
Logic Gui Professional a Gui Designer for MaxGui

Der Eisvogel

BeitragSa, Jun 02, 2012 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank jsp! Das hat mir die Arbeit ersparrt das ganze von Hand umzuwandeln. Jetzt funktioniert alles perfekt. Danke!

MfG
CrazyBox
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragMo, Jun 04, 2012 8:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Du gibst das encoding im header Content-Type mit an, wenn es fehlt, nimmt der server einfach irgendwas an.

Der Eisvogel

BeitragMo, Jun 04, 2012 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke BtbN. Auf Wikipedia habe ich in diesem Atemzug folgendes gefunden:
Code: [AUSKLAPPEN]
Content-Type: application/x-www-form-urlencoded; charset: UTF-8

Jedoch bezieht sich das nur auf Daten die per POST gesendet werden. Wie aber verhält sich das mit den Daten, die per GET gesendet werden?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Propellator

BeitragMo, Jun 04, 2012 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte genau gleich sein.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Der Eisvogel

BeitragDi, Jun 05, 2012 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Was heißt das? Der Content-Type gilt nur für angehängte Daten, wie z.B. die POST Daten, aber nicht für GET Daten.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Jolinah

BeitragDi, Jun 05, 2012 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwo hab ich gelesen, dass wenn nichts definiert wurde, ISO-8859-1 angenommen wird (Unicode). Andererseits denke ich, dass Content-Type schon auch für die GET Uri zuständig sein müsste, und nicht nur für das Entity (die Daten). Die Uri ansich ist ja sowieso immer in ASCII codiert dank der %-Schreibweise.

ZEVS

BeitragDi, Jun 05, 2012 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Irgendwo hab ich gelesen, dass wenn nichts definiert wurde, ISO-8859-1 angenommen wird (Unicode)

ISO-8859-1 ist Latin 1, also nicht Unicode.
RFC hat Folgendes geschrieben:
Some HTTP/1.0 software has interpreted a Content-Type header without
charset parameter incorrectly to mean "recipient should guess."
Senders wishing to defeat this behavior MAY include a charset
parameter even when the charset is ISO-8859-1 and SHOULD do so when
it is known that it will not confuse the recipient.

(http://tools.ietf.org/html/rfc2616#page-22)
Deshalb: Einfach HTTP 1.1 verwenden und charset mitsenden.

Jolinah

BeitragDi, Jun 05, 2012 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh stimmt, sorry Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group