Standard URL encode function?

后端 未结 13 1804
轻奢々
轻奢々 2020-11-30 05:33

Is there a Delphi equivalent of this .net\'s method:

Url.UrlEncode()

Note
I haven\'t worked with Delphi for several years now. As I

相关标签:
13条回答
  • 2020-11-30 06:00

    I have made my own function. It converts spaces to %20, not to plus sign. It was needed to convert local file path to path for browser (with file:/// prefix). The most important is it handles UTF-8 strings. It was inspired by Radek Hladik's solution above.

    function URLEncode(s: string): string;
    var
      i: integer;
      source: PAnsiChar;
    begin
      result := '';
      source := pansichar(s);
      for i := 1 to length(source) do
        if not (source[i - 1] in ['A'..'Z', 'a'..'z', '0'..'9', '-', '_', '~', '.', ':', '/']) then
          result := result + '%' + inttohex(ord(source[i - 1]), 2)
        else
          result := result + source[i - 1];
    end;       
    
    0 讨论(0)
  • 2020-11-30 06:02

    Another simple way of doing this is to use the HTTPEncode function in the HTTPApp unit - very roughly

    Uses 
      HTTPApp;
    
    function URLEncode(const s : string) : string;
    begin
      result := HTTPEncode(s);
    end
    

    HTTPEncode is deprecated in Delphi 10.3 - 'Use TNetEncoding.URL.Decode'

    Uses
      NetEncoding;
    
    function URLEncode(const s : string) : string;
    begin
      result := TNetEncoding.URL.Encode(s);
    end
    
    0 讨论(0)
  • 2020-11-30 06:03

    Another option, is to use the Synapse library which has a simple URL encoding method (as well as many others) in the SynaCode unit.

    uses
      SynaCode;
    ..
    begin
      s := EncodeUrl( str );
    //
      s := DecodeUrl( str );
    end;
    
    0 讨论(0)
  • 2020-11-30 06:04

    I was also facing the same issue (Delphi 4).

    I resolved the issue using below mentioned function:

    function fnstUrlEncodeUTF8(stInput : widestring) : string;
      const
        hex : array[0..255] of string = (
         '%00', '%01', '%02', '%03', '%04', '%05', '%06', '%07',
         '%08', '%09', '%0a', '%0b', '%0c', '%0d', '%0e', '%0f',
         '%10', '%11', '%12', '%13', '%14', '%15', '%16', '%17',
         '%18', '%19', '%1a', '%1b', '%1c', '%1d', '%1e', '%1f',
         '%20', '%21', '%22', '%23', '%24', '%25', '%26', '%27',
         '%28', '%29', '%2a', '%2b', '%2c', '%2d', '%2e', '%2f',
         '%30', '%31', '%32', '%33', '%34', '%35', '%36', '%37',
         '%38', '%39', '%3a', '%3b', '%3c', '%3d', '%3e', '%3f',
         '%40', '%41', '%42', '%43', '%44', '%45', '%46', '%47',
         '%48', '%49', '%4a', '%4b', '%4c', '%4d', '%4e', '%4f',
         '%50', '%51', '%52', '%53', '%54', '%55', '%56', '%57',
         '%58', '%59', '%5a', '%5b', '%5c', '%5d', '%5e', '%5f',
         '%60', '%61', '%62', '%63', '%64', '%65', '%66', '%67',
         '%68', '%69', '%6a', '%6b', '%6c', '%6d', '%6e', '%6f',
         '%70', '%71', '%72', '%73', '%74', '%75', '%76', '%77',
         '%78', '%79', '%7a', '%7b', '%7c', '%7d', '%7e', '%7f',
         '%80', '%81', '%82', '%83', '%84', '%85', '%86', '%87',
         '%88', '%89', '%8a', '%8b', '%8c', '%8d', '%8e', '%8f',
         '%90', '%91', '%92', '%93', '%94', '%95', '%96', '%97',
         '%98', '%99', '%9a', '%9b', '%9c', '%9d', '%9e', '%9f',
         '%a0', '%a1', '%a2', '%a3', '%a4', '%a5', '%a6', '%a7',
         '%a8', '%a9', '%aa', '%ab', '%ac', '%ad', '%ae', '%af',
         '%b0', '%b1', '%b2', '%b3', '%b4', '%b5', '%b6', '%b7',
         '%b8', '%b9', '%ba', '%bb', '%bc', '%bd', '%be', '%bf',
         '%c0', '%c1', '%c2', '%c3', '%c4', '%c5', '%c6', '%c7',
         '%c8', '%c9', '%ca', '%cb', '%cc', '%cd', '%ce', '%cf',
         '%d0', '%d1', '%d2', '%d3', '%d4', '%d5', '%d6', '%d7',
         '%d8', '%d9', '%da', '%db', '%dc', '%dd', '%de', '%df',
         '%e0', '%e1', '%e2', '%e3', '%e4', '%e5', '%e6', '%e7',
         '%e8', '%e9', '%ea', '%eb', '%ec', '%ed', '%ee', '%ef',
         '%f0', '%f1', '%f2', '%f3', '%f4', '%f5', '%f6', '%f7',
         '%f8', '%f9', '%fa', '%fb', '%fc', '%fd', '%fe', '%ff');
     var
       iLen,iIndex : integer;
       stEncoded : string;
       ch : widechar;
     begin
       iLen := Length(stInput);
       stEncoded := '';
       for iIndex := 1 to iLen do
       begin
         ch := stInput[iIndex];
         if (ch >= 'A') and (ch <= 'Z') then
           stEncoded := stEncoded + ch
         else if (ch >= 'a') and (ch <= 'z') then
           stEncoded := stEncoded + ch
         else if (ch >= '0') and (ch <= '9') then
           stEncoded := stEncoded + ch
         else if (ch = ' ') then
           stEncoded := stEncoded + '+'
         else if ((ch = '-') or (ch = '_') or (ch = '.') or (ch = '!') or (ch = '*')
           or (ch = '~') or (ch = '\')  or (ch = '(') or (ch = ')')) then
           stEncoded := stEncoded + ch
         else if (Ord(ch) <= $07F) then
           stEncoded := stEncoded + hex[Ord(ch)]
         else if (Ord(ch) <= $7FF) then
         begin
            stEncoded := stEncoded + hex[$c0 or (Ord(ch) shr 6)];
            stEncoded := stEncoded + hex[$80 or (Ord(ch) and $3F)];
         end
         else
         begin
            stEncoded := stEncoded + hex[$e0 or (Ord(ch) shr 12)];
            stEncoded := stEncoded + hex[$80 or ((Ord(ch) shr 6) and ($3F))];
            stEncoded := stEncoded + hex[$80 or ((Ord(ch)) and ($3F))];
         end;
       end;
       result := (stEncoded);
     end;
    

    source : Java source code

    0 讨论(0)
  • 2020-11-30 06:05

    I made myself this function to encode everything except really safe characters. Especially I had problems with +. Be aware that you can not encode the whole URL with this function but you need to encdoe the parts that you want to have no special meaning, typically the values of the variables.

    function MyEncodeUrl(source:string):string;
     var i:integer;
     begin
       result := '';
       for i := 1 to length(source) do
           if not (source[i] in ['A'..'Z','a'..'z','0','1'..'9','-','_','~','.']) then result := result + '%'+inttohex(ord(source[i]),2) else result := result + source[i];
     end;
    
    0 讨论(0)
  • 2020-11-30 06:07

    In a non-dotnet environment, the Wininet unit provides access to Windows' WinHTTP encode function: InternetCanonicalizeUrl

    0 讨论(0)
提交回复
热议问题