UTF-8 URI Unescape
Hab mich selber drangemacht - falls es sonst noch jemand gebrauchen kann:
Code: Alles auswählen
Procedure.s uriUnescape(uri.s)
Protected decoded.s, length, i
Protected *part=AllocateMemory(CountString(uri, "%")+1)
For i = 1 To Len(uri)
If Mid(uri, i, 1)<>"%"
decoded+Mid(uri, i, 1)
Else
PokeB(*part+length, Val("$"+Mid(uri, i+1, 2)))
length+1
i+2
EndIf
If length>0 And Mid(uri, i+1, 1)<>"%"
decoded+PeekS(*part, length, #PB_UTF8)
length=0
EndIf
Next
FreeMemory(*part)
ProcedureReturn decoded
EndProcedure
Zuletzt geändert von tyty am 21.03.2009 08:27, insgesamt 3-mal geändert.

Okay, hab mit den Memorybefehlen kaum Erfahrung. Ist editiert.
Dazu auch noch eine weitere Frage: Ich dachte mir, zum Escapen von URIs muesste ich das ganze einfach wie folgt umdrehen, aber warum bekomme ich "%73%FFFFFFFFFFFFFFC3%FFFFFFFFFFFFFFBC%79" als Ausgabe? Die Fs entstehen nur bei den Zeichen die mehr als 1 Byte brauchen. (Mir ist klar, das noch alles encodiert wird, es geht nur um's Prinzip.)
Dazu auch noch eine weitere Frage: Ich dachte mir, zum Escapen von URIs muesste ich das ganze einfach wie folgt umdrehen, aber warum bekomme ich "%73%FFFFFFFFFFFFFFC3%FFFFFFFFFFFFFFBC%79" als Ausgabe? Die Fs entstehen nur bei den Zeichen die mehr als 1 Byte brauchen. (Mir ist klar, das noch alles encodiert wird, es geht nur um's Prinzip.)
Code: Alles auswählen
Procedure.s uriEscape(uri.s)
Protected encoded.s
Protected *part=AllocateMemory(5)
Protected i
Protected j
For i = 1 To Len(uri)
PokeS(*part, Mid(uri, i, 1), -1, #PB_UTF8)
j=0
While PeekB(*part+j)<>0
encoded+"%"+Hex(PeekB(*part+j))
j+1
Wend
Next
ProcedureReturn encoded
EndProcedure
Debug uriEscape("süy")

tyty hat geschrieben:warum bekomme ich "%73%FFFFFFFFFFFFFFC3%FFFFFFFFFFFFFFBC%79" als Ausgabe? Die Fs entstehen nur bei den Zeichen die mehr als 1 Byte brauchen.
Versuch's mal mittyty hat geschrieben:Code: Alles auswählen
encoded+"%"+Hex(PeekB(*part+j))
Code: Alles auswählen
encoded + "%" + Hex(PeekB(*part+j),#PB_Byte)
Leider steht das nicht in der Hilfe.

Gruß, Little John
Sehr vielen Dank, jetzt funktioniert es.
Code: Alles auswählen
Procedure.s uriEscape(uri.s)
Protected encoded.s, part.s, i, j
Protected *part=AllocateMemory(5)
Protected expression = CreateRegularExpression(#PB_Any, "[a-zA-Z0-9/:?_\-.~]")
For i = 1 To Len(uri)
part.s=Mid(uri, i, 1)
If MatchRegularExpression(expression, part)
encoded+part
Else
PokeS(*part, part, -1, #PB_UTF8)
j=0
While PeekB(*part+j)<>0
encoded+"%"+Hex(PeekB(*part+j), #PB_Byte)
j+1
Wend
EndIf
Next
FreeMemory(*part)
FreeRegularExpression(expression)
ProcedureReturn encoded
EndProcedure
