delphi GB2312 编码转义URL字符串


本文整理自网络,侵删。

 QString 新增了 UrlEncode 函数,优化了性能,速度比官方的版本快一点,更重要的是可以ANSI和UTF8编码,或者是自己喜欢的编码都行。


function UrlEncode(const ABytes: PByte; l: Integer; ASpacesAsPlus: Boolean)
  : QStringW; overload;
function UrlEncode(const ABytes: TBytes; ASpacesAsPlus: Boolean)
  : QStringW; overload;
function UrlEncode(const S: QStringW; ASpacesAsPlus: Boolean;
  AUtf8Encode: Boolean = True): QStringW; overload;

function UrlEncode(const ABytes: PByte; l: Integer; ASpacesAsPlus: Boolean)
  : QStringW; overload;
function UrlEncode(const ABytes: TBytes; ASpacesAsPlus: Boolean)
  : QStringW; overload;
function UrlEncode(const S: QStringW; ASpacesAsPlus: Boolean;
  AUtf8Encode: Boolean = True): QStringW; overload;

三个重载,前两个方便使用自定义的编码的,第三个重载如果不使用UTF-8编码,就使用 ANSI 编码来处理。


实际上这个代码是直接改的系统的TURI.EncodeUrl,只是将默认的UTF-8编码更换为了Ansi

 

 

function AnsiURLEncode(const AValue: string; SpacesAsPlus: Boolean): string;

 

  function IsHexChar(C: Byte): Boolean;

  begin

    case Char(C) of

      '0' .. '9', 'a' .. 'f', 'A' .. 'F':

        Result := True;

    else

      Result := False;

    end;

  end;

 

// from http://www.faqs.org/rfcs/rfc3986.html

// URL safe chars = ['A' .. 'Z', 'a' .. 'z', '0' .. '9', '-', '_', '.', '~'];

const

  URLSafeCharMatrix: array [33 .. 127] of Boolean = (False, False, False, False,

    False, False, False, False, False, False, False, False, True, True, False,

    True, True, True, True, True, True, True, True, True, True, False, False,

    False, False, False, False, False, True, True, True, True, True, True, True,

    True, True, True, True, True, True, True, True, True, True, True, True,

    True, True, True, True, True, True, True, False, False, False, False, True,

    False, True, True, True, True, True, True, True, True, True, True, True,

    True, True, True, True, True, True, True, True, True, True, True, True,

    True, True, True, False, False, False, True, False);

 

  XD: array [0 .. 15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8',

    '9', 'A', 'B', 'C', 'D', 'E', 'F');

var

  Buff: TBytes;

  I: Integer;

begin

  Buff := TEncoding.ANSI.GetBytes(AValue);

  Result := '';

  I := 0;

  while I < Length(Buff) do

  begin

    if (I + 2 < Length(Buff)) and (Buff[I] = Ord('%')) then

      if IsHexChar(Buff[I + 1]) and IsHexChar(Buff[I + 2]) then

      begin

        Result := Result + '%' + Char(Buff[I + 1]) + Char(Buff[I + 2]);

        Inc(I, 3);

        Continue;

      end;

 

    if (Buff[I] = Ord(' ')) and SpacesAsPlus then

      Result := Result + '+'

    else

    begin

      if (Buff[I] >= 33) and (Buff[I] <= 127) then

      begin

        if URLSafeCharMatrix[Buff[I]] then

          Result := Result + Char(Buff[I])

        else

          Result := Result + '%' + XD[(Buff[I] shr 4) and $0F] +

            XD[Buff[I] and $0F];

      end

      else

        Result := Result + '%' + XD[(Buff[I] shr 4) and $0F] +

          XD[Buff[I] and $0F];

    end;

    Inc(I);

  end;

end;

相关阅读 >>

Delphi twebbrowser 响应回车键(ewb响应正常,无需额外代码)

Delphi 防止程序重复执行的单元

fastmm5

Delphi 怎么将一个文件流转换成字符串?

Delphi 高亮选中memo某一行

Delphi 合并文本行的函数

Delphi 判断一目录是否共享

一些不常用的且功能相当有用的Delphi函数

Delphi隐藏系统托盘tray图标

Delphi idhttp读取网页重定向

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



打赏

取消

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

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

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

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

评论

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