delphi HTTPEncode


本文整理自网络,侵删。

 
function HTTPEncode(const AStr: WideString): WideString;
//based on http://marc.durdin.net/2012/07/indy-tiduri-pathencode-urlencode-and-paramsencode-and-more/
const
  HexMap: WideString = '0123456789ABCDEF';

  function IsSafeChar(ch: Integer): Boolean;
  begin
    Result := ch in [Or d('0')..Or d('9'), Or d('A')..Or d('Z'), Or d('a')..Or d('z'),
      Or d('!'), Or d('('), Or d(')'), Or d('*'), Or d('-'), Or d('.'), Or d('_'),
      Or d('~'), Or d(''''), Or d('@'), Or d('#'), Or d('$'), Or d('&'), Or d('='),
      Or d(':'), Or d('/'), Or d(','), Or d(';'), Or d('?'), Or d('+')];
  end;

var
  I, J: Integer;
  S, Z, P: WideString;
  ASrcUTF8: UTF8String;
begin
  S := AStr;
  P := Copy(S, 1, Pos(WideString('://'), S));
  Delete(S, 1, Length(P));

  Z := '';
  ASrcUTF8 := UTF8Encode(S);
  // UTF8Encode call not strictly necessary but
  // prevents implicit conversion warning

  I := 1;
  J := 1;
  SetLength(Z, Length(ASrcUTF8) * 3); // space to %xx encode every byte
{$WARNINGS OFF} // turn off "Unsafe code 'String index to var param'"
// warnings. SetLength above guarantees that the string is long enough
  while I <= Length(ASrcUTF8) do
  begin
    if IsSafeChar(Or d(ASrcUTF8[I])) then
    begin
      Z[J] := WideChar(ASrcUTF8[I]);
      In c(J);
    end
    else
      if ASrcUTF8[I] = ' ' then
      begin
        Z[J] := '+';
        In c(J);
      end
      else
      begin
        Z[J] := '%';
        Z[J+1] := HexMap[(Or d(ASrcUTF8[I]) shr 4) + 1];
        Z[J+2] := HexMap[(Or d(ASrcUTF8[I]) and 15) + 1];
        In c(J,3);
      end;
    In c(I);
  end;
{$WARNINGS ON}
  SetLength(Z, J - 1);
  Result := P + Z;
end;

相关阅读 >>

Delphi idhashmessagedigest 获取文件md5

Delphi android检查互联网连接

文件占坑对付云安全

Delphi读取网页源文件和获取字符串

Delphi 比较两数字大小取最大值

Delphi 开关显示器操作

Delphi comparedatetime、comparedate、comparetime、samedatetime、samedate、sametime �c 对比时间的函数

Delphi开发的app如何调用外部app

Delphi nativeexcel获取excel所有列

Delphi controlcount和componentcount的区别

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...