URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von helpy »

Vorbemerkungen

Das Thema URL-Kodierung im Thread "ReceiveHTTPFile und Umlaute" hat mich ein wenig experimentieren lassen:

Hier einige Hinweise zu URLEncoder():

Beispiel:

Code: Alles auswählen

Debug URLEncoder("http://www.purebasic.com/sub dir/test with space.php3")
; Will print "http://www.purebasic.com/sub%20dir/test%20with%20space.php3"
Daraus ist schon ersichtlich, dass URLEncoder() keine "/" und ":" codiert. Dies ist jedoch nicht für alle Anwendungsfälle ausreichend, da es durchaus sein kann, dass eine ganze URL codiert und als Argument übergeben werden soll. In diesem Fall versagt die Funktion URLEncoder().

Mit dem Test

Code: Alles auswählen

Define test.s, i
For i = 1 To 255
  If Len(URLEncoder( chr( i ) )) = 1
    Debug URLEncoder( chr( i ) )
  EndIf
Next
sehen wir, dass folgende Ascii-Zeichen nicht codiert werden:

Code: Alles auswählen

!
#
$
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
=
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
~
Dies ist jedoch laut Wikipedia URL-Encoding nicht richtig!

Da URLEncoder() nur Ascii-Kodierung durchführt, werden alle Unicode-Zeichen des Strings URL in ein Fragezeichen "kodiert"!

Ich habe nun folgende Funktionen geschrieben:


UrlEncoderX()

Code: Alles auswählen

; ================================================================================
; Funktion:     Result.s = URLEncoderX( URL.s [, Encoding] )
;
; Argumente:    URL ........ Zu codierende URL
;               Encoding ... Zu verwendende Codierung
;                            Gültige Argumente:  #PB_UTF8, PB_Ascii
;                            Standard-Codierung: #PB_UTF8
;
; Beschreibung: Diese Funktion codiert einen String, sodass dieser als Argument
;               einer URL übergeben werden kann. Besondere Zeichen werden mit
;               dem Prozentzeichen und dem HEX-Code dargestellt.
;               Beispiel 1: URLEncoderX( "test_ä.html", #PB_Ascii )
;                           liefert als Ergebnis: test_%E4.html
;
;               Beispiel 2: URLEncoderX( "test_ä.html", #PB_UTF8 )
;                           liefert als Ergebnis: test_%C3%A4.html
;
Procedure.s URLEncoderX( URL.s, Encoding = #PB_UTF8 )
  Protected *memory, *UTF8.Ascii, EncodedURL.s
  
  Select Encoding
    Case #PB_UTF8, #PB_Ascii
      *memory = AllocateMemory( Len(URL) * 4 + 1 )
      *UTF8 = *memory
      
      If *UTF8
        ; Wenn als Ascii-Codierung verwendet wird, dann können nur 255 Zeichen
        ; dargestellt werden. Bei der Umwandlung in einen Ascii-String entsteht
        ; also ein falsches Ergebnis, wenn der URL-String Unicode-Zeichen enthält
        PokeS( *UTF8, URL, -1, Encoding )
        
        While *UTF8\a
          
          Select *UTF8\a
            
            Case 'A' To 'Z', 'a' To 'z', '0' To '9', '-', '_', '.', '~'
              ; Keine Codierung dieser Zeichen notwendig
              EncodedURL + chr(*UTF8\a)
            
            Default
              ; Codierung notwendig
              EncodedURL + "%" + RSet(Hex(*UTF8\a, #PB_Ascii),2,"0")
            
          EndSelect
          
          *UTF8 + 1
        Wend
        
        FreeMemory( *memory )
      Else
        ; Wenn kein Speicher allokiert werden konnte,
        ; liefert die Funktion einen Leer-String zurück.
      EndIf
    
    Default
      ; Encoding nicht erlaubt!
      ; Funktion liefert einen Leer-String zurück.
    
  EndSelect
  
  ProcedureReturn EncodedURL
EndProcedure
URLDecoderX()

Code: Alles auswählen

; ================================================================================
; Funktion:     Result.s = URLDecoderX( URL.s [, Encoding] )
;
; Argumente:    URL ........ Zu decodierende URL
;               Encoding ... Codierung, in der die URL vorliegt
;                            Gültige Argumente:  #PB_UTF8, PB_Ascii
;                            Standard-Codierung: #PB_UTF8
;
; Beschreibung: Diese Funktion decodiert einen URL-kodierten String.
;
Procedure.s URLDecoderX( URL.s, Encoding = #PB_UTF8 )
  Protected *URL.Character
  Protected *DecodedString, *DecodedByte.Ascii, DecodedURL.s, EncodedCharacter.s
  
  Select Encoding
    Case #PB_UTF8, #PB_Ascii
      *URL = @URL
      
      If *URL And *URL\c
        *DecodedString = AllocateMemory( Len(URL) + 1 )
        *DecodedByte = *DecodedString
        
        If *DecodedString
          While *URL\c
            
            Select *URL\c
              
              Case '%'
                ; Dekodierung
                *URL + SizeOf(Character)
                EncodedCharacter = Chr(*URL\c)
                *URL + SizeOf(Character)
                EncodedCharacter + Chr(*URL\c)
                *DecodedByte\a = Val( "$" + EncodedCharacter )
              
              Default
                ; Zeichen direkt übernehmen!
                *DecodedByte\a = *URL\c
              
            EndSelect
            
            *DecodedByte + 1
            *URL + SizeOf(Character)
          Wend
          
          DecodedURL = PeekS( *DecodedString, -1, Encoding )
          FreeMemory( *DecodedString )
        Else
          
        EndIf
        
      Else
        ; Leer-String
      EndIf
    
    Default
      ; Encoding nicht erlaubt!
      ; Funktion liefert einen Leer-String zurück.
    
  EndSelect
  
  ProcedureReturn DecodedURL
EndProcedure
Anmerkungen

Die Funktion URLEncoderX() kodiert den gesamten an die Funktion übergebenen String!

Eine intelligente Funktion, die immer genau weiß, welcher Teil zu kodieren ist, gibt es nicht! Aus diesem Grund habe ich URLEncoderX() so geschrieben, dass der gesamte String kodiert wird. Die letztlich zu verwendende URL muss aus Basis-URL und dem/den kodierten Argument(en) noch zusammengesetzt werden!


Korrekturen

Falls einer von Euch noch Korrekturen hat, meldet Euch bitte!


lg,
guido
Zuletzt geändert von helpy am 03.07.2013 00:32, insgesamt 3-mal geändert.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von ts-soft »

:allright: sehr nützlich!
helpy hat geschrieben: Korrekutren

Fall einer von Euch noch Korrekturen hat, meldet Euch bitte!
Ja, kannste mir das fette Wort erklären :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von Falko »

ts-soft hat geschrieben::allright: sehr nützlich!
helpy hat geschrieben: Korrekutren

Fall einer von Euch noch Korrekturen hat, meldet Euch bitte!
Ja, kannste mir das fette Wort erklären :mrgreen:

Gruß
Thomas
Da besteht nun kein Erklärungsbedarf mehr. Auch bei dem Wort mit F nicht mehr. :wink:
Zum "sehr nützlich" , schließe ich mich gleich mit an :allright:

Gruß,
Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von helpy »

ts-soft hat geschrieben:
helpy hat geschrieben: Korrekutren

Fall einer von Euch noch Korrekturen hat, meldet Euch bitte!
Ja, kannste mir das fette Wort erklären :mrgreen:
uups ;-)

... aber wer hat das jetzt im Original korrigiert?
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von ts-soft »

helpy hat geschrieben:... aber wer hat das jetzt im Original korrigiert?
Ich vermute mal, das es Falco gut mit Dir gemeint hat :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von RSBasic »

Das war Falko.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von helpy »

Danke Falko,

ich habe noch einen Fehler gefunden!
Nun die Überschrift zur Funktion von UrlEncoderX() korrigiert (da stand UrlDecoderX()) ...
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von Falko »

:allright:
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von Kiffi »

@helpy: Danke! :allright:

Grüße ... Kiffi
a²+b²=mc²
Roby
Beiträge: 2
Registriert: 19.04.2013 21:03

Re: URLEncoder/URLDecoder ==> URLEncoderX/URLDecoderX

Beitrag von Roby »

Hm, hatte ich bisher noch nicht bedacht. Trifft das auch auf URL Encoder zu, die mit JavaScript arbeiten?
Antworten