Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Décodage d'URL

12 réponses
Avatar
Gloops
Bonjour tout le monde,

Pour transf=E9rer une URL de type mailto: =E0 un autre logiciel, j'ai bes=
oin=20
de convertir une URL "sans espaces", style "subject:D%E9veloppeur%20VB", =

en cha=EEne de caract=E8res lisible, style "subject:D=E9veloppeur VB".

J'ai essay=E9 ceci :
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D
Public Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long)
Public Const ICU_DECODE As Long =3D &H10000000

Public Function DecodeURL(strURL As String) As String
Dim strTemp As String, strBuff As String
strTemp =3D strURL
strBuff =3D Space(256)
InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE
DecodeURL =3D Left$(strBuff, InStr(strBuff, Chr$(0)) - 1)
End Function
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D

Mais pas de chance, InternetCanonicalizeUrl fait simplement une copie de =

strTemp vers strBuff -et donc ma fonction aussi.

Alors quoi, je vais parcourir moi-m=EAme la cha=EEne pour d=E9tecter le s=
igne=20
pourcent, et =E0 chaque fois que je l'aurai trouv=E9 je vais consid=E9rer=
les=20
deux caract=E8res suivants comme un nombre hexad=E9cimal dont il faudra=20
fournir le caract=E8re correspondant ?

Ben si j'avais su, je l'aurais fait tout de suite ...


D'ailleurs, ici
http://msdn2.microsoft.com/en-us/library/aa384342.aspx
on me parle d'une valeur de retour de InternetCanonicalizeUrl, alors que =

ApiViewer2004 (charg=E9 il y a quelques semaines) la d=E9clare comme une =

Sub, donc sauf truc qui me serait pass=E9 au-dessus, sous VB, sans valeur=
=20
de retour.
C'est quoi, que j'ai loup=E9 ?

10 réponses

1 2
Avatar
Fred
Dans : news:,
Gloops disait :
Bonjour tout le monde,



Bonsoir,

Pour transférer une URL de type mailto: à un autre logiciel, j'ai
besoin de convertir une URL "sans espaces", style
"subject:D%E9veloppeur%20VB", en chaîne de caractères lisible, style
"subject:Développeur VB".
J'ai essayé ceci :



InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE



ET avec :
ICU_DECODE | ICU_NO_ENCODE
?



--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Jean-marc
Fred wrote:
Dans : news:,
Gloops disait :
Bonjour tout le monde,



Bonsoir,

Pour transférer une URL de type mailto: à un autre logiciel, j'ai
besoin de convertir une URL "sans espaces", style
"subject:D%E9veloppeur%20VB", en chaîne de caractères lisible, style
"subject:Développeur VB".
J'ai essayé ceci :



InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE



ET avec :
ICU_DECODE | ICU_NO_ENCODE
?



Hello,

je complète la réponse de Fred:

Attention: en VB, le "|" c'est "Or". Le |, c'est en C.

Ca donne:

' ajouter cette constante
Const ICU_NO_ENCODE As Long = &H20000000

Public Function DecodeURL(strURL As String) As String
Dim strTemp As String, strBuff As String

strTemp = strURL
strBuff = Space(256)
InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE Or
ICU_NO_ENCODE
DecodeURL = Left$(strBuff, InStr(strBuff, Chr$(0)) - 1)
End Function

Et voila :-)

? DecodeURL("D%E9veloppeur%20VB")
Développeur VB


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Gloops
Jean-marc a écrit, le 04/05/2007 20:20 :

Et voila :-)

? DecodeURL("D%E9veloppeur%20VB")
Développeur VB





Ah ben je dois dire que vous m'en bouchez un coin, tous les deux.
J'avais bien vu ICU_NO_ENCODE dans les paramètres, mais je ne me
représentais pas que la fonction s'amusait à réencoder juste aprè s avoir
décodé.

Bon, effectivement, comme ça, ça marche. Merci.

J'ai l'impression qu'il doit y avoir de quoi faire pour quelqu'un qui
voudrait présenter des exemples de cette API. Quelqu'un s'y serait-il
frotté ?
Avatar
Jean-marc
Gloops wrote:
Jean-marc a écrit, le 04/05/2007 20:20 :

Et voila :-)

? DecodeURL("D%E9veloppeur%20VB")
Développeur VB





Ah ben je dois dire que vous m'en bouchez un coin, tous les deux.
J'avais bien vu ICU_NO_ENCODE dans les paramètres, mais je ne me
représentais pas que la fonction s'amusait à réencoder juste après
avoir décodé.

Bon, effectivement, comme ça, ça marche. Merci.

J'ai l'impression qu'il doit y avoir de quoi faire pour quelqu'un qui
voudrait présenter des exemples de cette API. Quelqu'un s'y serait-il
frotté ?



En tout cas, c'est une bonne idée de nouvel article pour la FAQ VB :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Gloops
Gloops a écrit, le 04/05/2007 17:15 :
D'ailleurs, ici
http://msdn2.microsoft.com/en-us/library/aa384342.aspx
on me parle d'une valeur de retour de InternetCanonicalizeUrl, alors qu e
ApiViewer2004 (chargé il y a quelques semaines) la déclare comme un e
Sub, donc sauf truc qui me serait passé au-dessus, sous VB, sans vale ur
de retour.
C'est quoi, que j'ai loupé ?




Au fait, ça, c'est les effets de bord habituels ?
Avatar
Jean-marc
Gloops wrote:
Gloops a écrit, le 04/05/2007 17:15 :
D'ailleurs, ici
http://msdn2.microsoft.com/en-us/library/aa384342.aspx
on me parle d'une valeur de retour de InternetCanonicalizeUrl, alors
que ApiViewer2004 (chargé il y a quelques semaines) la déclare comme
une Sub, donc sauf truc qui me serait passé au-dessus, sous VB, sans
valeur de retour.
C'est quoi, que j'ai loupé ?




Au fait, ça, c'est les effets de bord habituels ?



En fait il y a une confusion; La fonction telle qu'elle existe dans
wininet.dll est bien toujours une fonction, qui retourne un Booléen.

Mais rien n'interdit de la déclarer en VB comme une Sub:

Ainsi, ceci est valide:

Private Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long)

En fait, ce faisant, on dit juste à VB qu'on veut négliger la
valeur de retour.
Ca vient du C en fait.

En C on peut faire:

fichier truc.c
--------------
int toto(int a)
{
return 1;
}

fichier budule.c
----------------

void toto(int a);

toto(3);

Voila pour la technique.

Ceci dit l'api viewer se trompe. InternetCanonicalizeUrl est
bel et bien toujours une fonction, même si rien n'interdit de
la déclare en Sub.

Ouf, j'espère avoir été clair :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Gloops
Jean-marc a écrit, le 04/05/2007 21:15 :
En fait, ce faisant, on dit juste à VB qu'on veut négliger la
valeur de retour.
Ca vient du C en fait.




Bon, d'accord.
Alors si on veut la valeur de retour je suppose qu'on déclare comme ç a :

Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Boolean
Avatar
Jean-marc
Gloops wrote:
Jean-marc a écrit, le 04/05/2007 21:15 :
En fait, ce faisant, on dit juste à VB qu'on veut négliger la
valeur de retour.
Ca vient du C en fait.




Bon, d'accord.
Alors si on veut la valeur de retour je suppose qu'on déclare comme
ça :
Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Boolean



Presque :-)

En fait la dll de wininet est écrite en C. La fonction retourne un BOOL.
Mais en C, pas de booléen. LE BOOL est un type "windows", pas un type C.
En fait, dans les couches basses, voici la définition:

typedef int BOOL;

Au final, la fonction retourne donc un "int" du C.
Et en général, quand on récupère un "int" du C coté VB, on récupère tout
ça dans un long (VB). Voici donc:

Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Long

La fonction retourne (1) en cas de succès, et (0) en cas déchec.
A noter qu'en VB, True est représenté par -1, alors qu'en C, la
convention est que False est représenté par 0 et toute autre valeur que
zéro est True.

Donc si tu veux être un vrai puriste, il faut déclarer la fonction comme
indiquée plus haut, retournant un Long et pour l'usage tu peux faire comme
ça:

Dim ret As Long
Dim bRet As Boolean

ret = InternetCanonicalizeUrl(strTemp, strBuff, 255, ICU_DECODE Or
ICU_NO_ENCODE)

bRet = CBool(ret)
If bRet Then
' succès
Else
' echec
End If

Ca fonctionne bien car CBool(1) va retourner True et CBool(0) va retourner
False,
ce qui est le résultat attendu :-)

Ouf !!


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jean-marc
Jean-marc wrote:
Gloops wrote:



Alors si on veut la valeur de retour je suppose qu'on déclare comme
ça :
Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Boolean





En fait, si tu déclares comme ça ça marche aussi car VB va
se débrouiller pour faire la promotion (le casting) correct
dans le type booléen de VB.

Mais j'aime meiux (affaire de goût) garder les déclarations
avec les vrais types, et faire le casting "à la main" !

Bref ...

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
parci
On Fri, 04 May 2007 20:50:42 +0200, Gloops
wrote:

J'ai l'impression qu'il doit y avoir de quoi faire pour quelqu'un qui
voudrait présenter des exemples de cette API. Quelqu'un s'y serait-il
frotté ?



J'utilise plutôt les fonctions de Shlwapi.dll qui permettent le même
genre de chose :

http://vbnet.mvps.org/index.html?code/internet/urlcanonicalize.htm
http://vbnet.mvps.org/index.html?code/internet/urlescape.htm
http://vbnet.mvps.org/index.html?code/internet/urlcreatefrompath.htm
http://vbnet.mvps.org/index.html?code/internet/urlgetpart.htm
1 2