Standard URL encode function?

后端 未结 13 1848
轻奢々
轻奢々 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 05:55

    TIdUri or HTTPEncode has problems with unicode charactersets. Function below will do correct encoding for you.

    function EncodeURIComponent(const ASrc: string): UTF8String;
    const
      HexMap: UTF8String = '0123456789ABCDEF';
    
      function IsSafeChar(ch: Integer): Boolean;
      begin
        if (ch >= 48) and (ch <= 57) then Result := True    // 0-9
        else if (ch >= 65) and (ch <= 90) then Result := True  // A-Z
        else if (ch >= 97) and (ch <= 122) then Result := True  // a-z
        else if (ch = 33) then Result := True // !
        else if (ch >= 39) and (ch <= 42) then Result := True // '()*
        else if (ch >= 45) and (ch <= 46) then Result := True // -.
        else if (ch = 95) then Result := True // _
        else if (ch = 126) then Result := True // ~
        else Result := False;
      end;
    var
      I, J: Integer;
      ASrcUTF8: UTF8String;
    begin
      Result := '';    {Do not Localize}
    
      ASrcUTF8 := UTF8Encode(ASrc);
      // UTF8Encode call not strictly necessary but
      // prevents implicit conversion warning
    
      I := 1; J := 1;
      SetLength(Result, Length(ASrcUTF8) * 3); // space to %xx encode every byte
      while I <= Length(ASrcUTF8) do
      begin
        if IsSafeChar(Ord(ASrcUTF8[I])) then
        begin
          Result[J] := ASrcUTF8[I];
          Inc(J);
        end
        else if ASrcUTF8[I] = ' ' then
        begin
          Result[J] := '+';
          Inc(J);
        end
        else
        begin
          Result[J] := '%';
          Result[J+1] := HexMap[(Ord(ASrcUTF8[I]) shr 4) + 1];
          Result[J+2] := HexMap[(Ord(ASrcUTF8[I]) and 15) + 1];
          Inc(J,3);
        end;
        Inc(I);
      end;
    
      SetLength(Result, J-1);
    end;
    

提交回复
热议问题