Page 1 of 2

URLEncode

Posted: Thu Mar 02, 2006 3:45 pm
by Bonne_den_kule
Code updated For 5.20+

Code: Select all

Procedure.s URLEncode(string.s)
  char.s
  urlstring.s
  For i=1 To Len(string)
    char = Mid(string,i,1)
    If FindString("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()", UCase(char), 1) > 0
      urlstring+char
      Continue
    ElseIf char=" "
      urlstring+"+"
      Continue
    Else
      urlstring+"%"+RSet(Hex(Asc(char)),2,"0")
    EndIf
  Next
  ProcedureReturn urlstring
EndProcedure
EDIT:
Fixed a bug

Posted: Thu Mar 02, 2006 4:37 pm
by El_Choni
Couldn't resist... :)

Code: Select all

Procedure.s URLEncode2(string.s)
  SEnd = @string+Len(string)
  *Seeker.BYTE = @string
  While *Seeker<SEnd
    Select *Seeker\b
      Case 32
        urlstring$+"+"
      Case 48 To 57, 65 To 90, 97 To 122
        urlstring$+Chr(*Seeker\b)
      Default
        urlstring$+"%"+Right(Hex(*Seeker\b), 2)
    EndSelect
    *Seeker+1
  Wend
  ProcedureReturn urlstring$
EndProcedure

Posted: Thu Mar 02, 2006 6:38 pm
by va!n
@El_Choni!
Compiling your source with PB4b4 returns an ASM error here

Posted: Thu Mar 02, 2006 7:04 pm
by El_Choni
Yes, Trond reported that in the bug section. As a workaround, until this is fixed, you use this:

Code: Select all

Procedure.s URLEncode2(string.s)
  SEnd = @string+Len(string)
  *Seeker.BYTE = @string
  While *Seeker<SEnd
    Select *Seeker\b
      Case 32
        urlstring$+"+"
      Case 48 To 57, 65 To 90
        urlstring$+Chr(*Seeker\b)
      Case 97 To 122
        urlstring$+Chr(*Seeker\b)
      Default
        urlstring$+"%"+Right(Hex(*Seeker\b), 2)
    EndSelect
    *Seeker+1
  Wend
  ProcedureReturn urlstring$
EndProcedure 

Posted: Thu Mar 02, 2006 7:04 pm
by Trond
And neither of your sources does a correct URLEncode.

The following (ranges of) characters should NOT be escaped:
A..Z
0..9
-
_
.
!
~
*
'
(
)

Posted: Thu Mar 02, 2006 7:09 pm
by El_Choni
Now?:

Code: Select all

Procedure.s URLEncode2(string.s)
  SEnd = @string+Len(string)
  *Seeker.BYTE = @string
  While *Seeker<SEnd
    Select *Seeker\b
      Case 32
        urlstring$+"+"
      Case 48 To 57, 65 To 90
        urlstring$+Chr(*Seeker\b)
      Case 97 To 122
        urlstring$+Chr(*Seeker\b)
      Case '-','_','.','!','~','*',39,'(',')'
        urlstring$+Chr(*Seeker\b)
      Default
        urlstring$+"%"+Right(Hex(*Seeker\b), 2)
    EndSelect
    *Seeker+1
  Wend
  ProcedureReturn urlstring$
EndProcedure 

Posted: Thu Mar 02, 2006 8:08 pm
by Nik
And it isn't unicode enabled :lol:
This should be though I didn't test very much:

Code: Select all

Procedure.s URLEncode2(string.s)
  SEnd = @string+Len(string)
  *Seeker.CHARACTER = @string
  Repeat
    Select *Seeker\c
      Case 32
        urlstring$+"+"
      Case 48 To 57, 65 To 90
        urlstring$+Chr(*Seeker\c)
      Case 97 To 122
        urlstring$+Chr(*Seeker\c)
      Case '-','_','.','!','~','*',39,'(',')'
        urlstring$+Chr(*Seeker\c)
      Default
        urlstring$+"%"+Right(Hex(*Seeker\c), 2)
    EndSelect
    *Seeker+SizeOf(CHARACTER)
  Until *Seeker>=@string+(Len(String)*SizeOf(Character))
  ProcedureReturn urlstring$
EndProcedure 

Posted: Thu Mar 02, 2006 9:50 pm
by Flype
And it could be simpler/shorter :

Code: Select all

Procedure.s URLEncode2(string.s)
  *Seeker.CHARACTER = @string
  Repeat
    Select *Seeker\c
      Case 32
        urlstring$+"+"
      Case 48 To 57, 65 To 90
        urlstring$+Chr(*Seeker\c)
      Case 97 To 122
        urlstring$+Chr(*Seeker\c)
      Case '-','_','.','!','~','*',39,'(',')'
        urlstring$+Chr(*Seeker\c)
      Default
        urlstring$+"%"+Right(Hex(*Seeker\c), 2)
    EndSelect
    *Seeker+SizeOf(CHARACTER)
  Until *Seeker\c = 0
  ProcedureReturn urlstring$
EndProcedure 

Posted: Fri Mar 03, 2006 12:20 am
by Bonne_den_kule
My ownage code :lol: :

Code: Select all

Procedure.s URLEncode(string.s)
  char.s
  urlstring.s
  For i=1 To Len(string)
    char = Mid(string,i,1)
    If FindString("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()", UCase(char), 1) > 0
      urlstring+char
      Continue
    ElseIf char=" "
      urlstring+"+"
      Continue
    Else
      urlstring+"%"+RSet(Hex(Asc(char)),2,"0")
    EndIf
  Next
  ProcedureReturn urlstring
EndProcedure

Posted: Fri Mar 03, 2006 12:26 am
by Bonne_den_kule
Can someone compare the speed of all these URLEncode functions?

Posted: Fri Mar 03, 2006 11:11 am
by Trond
There is also an API function called UrlEncode() that should do this.

Posted: Fri Mar 03, 2006 11:14 am
by El_Choni
But ours are better :wink:

Posted: Fri Mar 03, 2006 11:45 am
by Bonne_den_kule
Our codes are pure...
:lol:

Posted: Fri Mar 03, 2006 9:06 pm
by blueznl
:P

Posted: Sat Mar 04, 2006 10:44 pm
by dell_jockey
El_Choni wrote:But ours are better :wink:
why are your codes better than an api call? :?: just wondering...