能否实现类似java的URLEncoder.encode函数的功能,
1 对字母、数字,保持不变,
2 对".","-","*", and "_"保存不变。
3 " "转变为'+'

其他按照GBK或UTF-8格式转化为编码值
java里有现成的函数,Delphi高低版本,找不到这个函数

解决方案 »

  1.   

      我是在开发,用delphi7,api方式接入淘宝、拍拍、京东、1号店等电商平台,
    实现订单下载和发货单号修改时,遇到这个问题的。
      

  2.   

    自带的indy就有
    uses
      IdURI;begin
      str := TIdURI.URLEncode(url);
      str := TIdURI.URLDecode(url);
    end;
      

  3.   

    function TForm1.HTTPEncode(const AStr : string): string;
    const
        NoConversion = ['A'..'Z','a'..'z','*','@','.','_','-'];
    var   
        Sp, Rp : PChar;
    begin
      SetLength(Result, Length(AStr)*3);
      Sp := PChar(AStr);
      Rp := PChar(Result);
      while Sp^ <> #0 do
      begin
        if Sp^ in NoConversion then
          Rp^ := Sp^
        else if Sp^ = ' 'then
          Rp^ := '+'
        else
          begin
            FormatBuf(Rp^, 3, '%%%.2x ', 6, [Ord(Sp^)]);
            Inc(Rp, 2);
          end;
        Inc(Rp);
        Inc(Sp);
      end;
      SetLength(Result, Rp - PChar(Result));
    end;
      

  4.   

    TIdURI 有个Protocol属性是必输的。不知道是什么值
      

  5.   

    andwo :HTTPEncode函数,delphi有现成的,而URLEnCode需要找找 HTTPEncode是替换掉URL中request等中的'/\'等程序内的系统分隔符号,OK
               替换成通用的特殊符号,防止分隔符和请求值中的分隔符混杂,出现解析错误。 URLEnCode,是把字符串的,数字和字母保持不变输出,其他非数字和字母,
                按照不同编码,如GBK、UTF-8,得到不同的编码值。OK
      

  6.   

    呵呵,不懂,这个行不行
    http://bbs.csdn.net/topics/80149586
      

  7.   

    这个delphi版的UrlEnode函数逻辑上正确,我测试一下结果,再说。
      

  8.   

    function TForm1.URLEncode(const S: string): string;
    var Idx: Integer; InQueryString :Boolean;
    begin
       Result :='';
       InQueryString :=true;   for Idx :=1 to Length(S) do begin
          case S[Idx] of
             'A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.': //1 用户常用的字母和数字,以及'-_.'不作为系统分隔符,可以不做转换。
                Result := Result + S[Idx];
             ' ': //2 空格符号,转化为+或%20,函数外,都加替换掉’+‘的处理代码
                if InQueryString then
                     Result :=Result +'+'
                else Result :=Result +'%20';
             else //3 其他特殊符号或中文,都要转化为3位的Utf-8编码值
                Result := Result + '%' + SysUtils.IntToHex(Ord(S[Idx]), 2);
          end;
       end;
    end;测试结果,这个dephi版的UrlEncode函数,相当于java版的UrlEncode,编码方式是gbk,而不是utf-8。
      

  9.   

    楼上,你找到 utf-8的 的转换没有?
    我现在也有和你一样的问题.在java下 java.net.URLEncoder.encode(str,"utf-8") 就正常,delphi下还没找到方法
      

  10.   

    我现在是正在做 ems 的API接口.... 做好了java版本的,但涉及到activeX,在浏览器中支持不好,打印后,浏览器也失败焦点,很不方便.想改为delphi来做... md5,base64 我都基本搞定,就差这个URL编码的....
      

  11.   

    //得到gbk方式的字符串编码值(淘宝京东只是Utf-8,拍拍有此的utf-8和gbk处理)
    { HTTPEncode 替换掉URL中request等中的'/\'等程序内的系统分隔符号,替换成通用的特殊符号,防止分隔符和请求值中的分隔符混杂,出现解析错误。
      URLEnCode,把字符串的,数字和字母保持不变输出,其他非数字和字母,按照不同编码,如GBK、UTF-8,得到不同的编码值。}
    //实现思路:正向,根据输入的值,根据值,是否转为编码值,或不不转化。
    function URLEncode_gbk(S: String) :string; //得到GBK编码方式的字符串编码值
    var i: Integer; InQueryString :Boolean;
    begin
       Result :='';
       InQueryString :=true;   for i :=1 to Length(S) do begin
          case S[i] of
             'A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.': //1 用户常用的字母和数字,以及'-_.'不作为系统分隔符,可以不做转换。
                Result := Result + S[i];
             ' ': //2 空格符号,转化为+或%20,函数最后,都加替换掉’+‘的处理代码
                if InQueryString then
                     Result :=Result +'+'
                else Result :=Result +'%20';
             else //3 其他特殊符号或中文,都要转化为3位的Gbk或Utf-8编码值
                Result := Result + '%' + SysUtils.IntToHex(Ord(S[i]), 2); //外部加%
          end;
       end;
       Result :=StringReplace(Result, '+', '%20', [rfReplaceAll]);
       Result :=StringReplace(Result, '*', '%2A', [rfReplaceAll]);
    end;//因为utf-8是1或3个字节,所以不能采用类似gbk编码的单一的正向处理
    //要先统一的正向编码处理,然后反向处理:如果是特殊字符或非数字字母的编号,就会保持UTF-8编码值,
    //                                      如果是普通字段,转化为原来的ascii值。
    //类似鱼钩算法,去了后,有横的、有回钩的。
    function URLEncode_Utf8(S :String) :string; //得到GBK编码方式的字符串编码值