delphi版的URLDecode和URLEncode

php自带了URLDecode和urldecode函数,可以用来对&=等一些出现在url或者get/post内容中的控制字符进行转义。

delphi没有自带此类函数,必须自己写。

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;
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;

Posted in 开发手记 at 08月 12th, 2009. Trackback URI: trackback
Tags:

No Responses to “delphi版的URLDecode和URLEncode”

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
请输入图片中的字符以验证你并非垃圾机器人. 点击图片收听验证码的语音版.
点击这里收听此验证码的语音版本