je cherche une méthode de la Win32 ou Wininet sous XP offrant le service d’encodage des caractères “particuliers” pouvant composer une URL. Typiquement une fonction transformant les ESPACES en %20, les ‘+’ en %2B, etc…
J’ai essayé InternetCanonicalizeUrl => marche pas pour les '+' UrlCombine et autre méthodes de shlwapi mais étant sous XP, “j’ai pas”.
Bref, y’a quoi sous XP / MSDEV 6.O qui rend ce service ? Je cherche l’équivalent de encodeURIComponent offert par javascript.
C’est du code en pascal objet trouvé sur le net, mais ça n’a rien de bien compliqué et surtout ça marche, alors au cas où tu ne trouve pas ton bonheur, libre à toi de traduire ça en c/c++/autre
[code]function URLEncode(const S: string; const InQueryString: Boolean): string;
var
Idx: Integer; // loops thru characters in string
begin
Result := ‘’;
for Idx := 1 to Length(S) do
begin
case S[Idx] of
’A’…‘Z’, ‘a’…‘z’, ‘0’…‘9’, ‘-’, ‘_’, ‘.’:
Result := Result + S[Idx];
’ ':
if InQueryString then
Result := Result + '+'
else
Result := Result + ‘%20’;
else
Result := Result + ‘%’ + SysUtils.IntToHex(Ord(S[Idx]), 2);
end;
end;
end;
function URLDecode(const S: string): string;
var
Idx: Integer; // loops thru chars in string
Hex: string; // string of hex characters
Code: Integer; // hex character code (-1 on error)
begin
// Intialise result and string index
Result := ‘’;
Idx := 1;
// Loop thru string decoding each character
while Idx <= Length(S) do
begin
case S[Idx] of
’%’:
begin
// % should be followed by two hex digits - exception otherwise
if Idx <= Length(S) - 2 then
begin
// there are sufficient digits - try to decode hex digits
Hex := S[Idx+1] + S[Idx+2];
Code := SysUtils.StrToIntDef(’$’ + Hex, -1);
Inc(Idx, 2);
end
else
// insufficient digits - error
Code := -1;
// check for error and raise exception if found
if Code = -1 then
raise SysUtils.EConvertError.Create(
‘Invalid hex digit in URL’
);
// decoded OK - add character to result
Result := Result + Chr(Code);
end;
’+’:
// + is decoded as a space
Result := Result + ’ '
else
// All other characters pass thru unchanged
Result := Result + S[Idx];
end;
Inc(Idx);
end;
end;[/code]
Note : en pascal objet, les chaînes commencent à machaine[1], et non 0 (qui indique la longueur).
EDIT : je ne sais pas comment faire pour afficher le code en ‘frame’.
Merci c’est gentil mais je n’ai pas de difficulté à recoder tous types de services, c’est sûr, en revanche avant de tout refaire, j’aime bien m’assurer que ça n’existe pas déjà au travers des API des différents environnements de développement. Là je suis trèèèès surpris de ne pas trouver ce type de service dans la Wininet ou Win32 et ça me gonfle de recogner un service qui devrait exister.
Personne n’a développer une appli « Internet » sous Windows ?