UTF-8 URI Unescape

Anfängerfragen zum Programmieren mit PureBasic.
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

Japanische Zeichen koennen definitiv dargestellt werden, besonders da ja das eine Zeichen angezeigt wird und nur das andere nicht.
Bild
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

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.
Bild
Little John

Beitrag von Little John »

Ich würde gleich am Anfang ausreichend Speicher allokieren, anstatt innerhalb der Schleife wiederholt ReAllocateMemory() zu benutzen.

Gruß, Little John
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

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

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

Beitrag von 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.
tyty hat geschrieben:

Code: Alles auswählen

encoded+"%"+Hex(PeekB(*part+j))
Versuch's mal mit

Code: Alles auswählen

encoded + "%" + Hex(PeekB(*part+j),#PB_Byte)
... das sollte den gewünschten Effekt erzielen.
Leider steht das nicht in der Hilfe. :(

Gruß, Little John
tyty
Beiträge: 52
Registriert: 28.03.2008 22:39
Wohnort: Tokyo
Kontaktdaten:

Beitrag von tyty »

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
Bild
Antworten