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.
									
			
									
- 
				Little John
 
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")
- 
				Little John
 
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