delphi 实现类似java的URLEnCode.enCode函数的能

披着虎皮的石头 2013-06-18 03:39:21
能否实现类似java的URLEncoder.encode函数的功能,
1 对字母、数字,保持不变,
2 对".","-","*", and "_"保存不变。
3 " "转变为'+'
4
其他按照GBK或UTF-8格式转化为编码值
java里有现成的函数,Delphi高低版本,找不到这个函数
...全文
954 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
//得到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编码方式的字符串编码值
龟蛇龙 2013-07-06
  • 打赏
  • 举报
回复
楼上,你找到 utf-8的 的转换没有? 我现在也有和你一样的问题. 在java下 java.net.URLEncoder.encode(str,"utf-8") 就正常,delphi下还没找到方法
hsfzxjy 2013-07-06
  • 打赏
  • 举报
回复
引用 2 楼 sololie 的回复:
自带的indy就有

uses
  IdURI;

begin
  str := TIdURI.URLEncode(url);
  str := TIdURI.URLDecode(url);
end;
这个可以用啊,我现在都在用
龟蛇龙 2013-07-06
  • 打赏
  • 举报
回复
我现在是正在做 ems 的API接口.... 做好了java版本的,但涉及到activeX,在浏览器中支持不好,打印后,浏览器也失败焦点,很不方便. 想改为delphi来做... md5,base64 我都基本搞定,就差这个URL编码的....
  • 打赏
  • 举报
回复
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。
  • 打赏
  • 举报
回复
引用 7 楼 andwo 的回复:
呵呵,不懂,这个行不行 http://bbs.csdn.net/topics/80149586
这个delphi版的UrlEnode函数逻辑上正确,我测试一下结果,再说。
andwo 2013-06-18
  • 打赏
  • 举报
回复
呵呵,不懂,这个行不行 http://bbs.csdn.net/topics/80149586
  • 打赏
  • 举报
回复
码农: 你的算法不可行
  • 打赏
  • 举报
回复
andwo :HTTPEncode函数,delphi有现成的,而URLEnCode需要找找 HTTPEncode是替换掉URL中request等中的'/\'等程序内的系统分隔符号,OK 替换成通用的特殊符号,防止分隔符和请求值中的分隔符混杂,出现解析错误。 URLEnCode,是把字符串的,数字和字母保持不变输出,其他非数字和字母, 按照不同编码,如GBK、UTF-8,得到不同的编码值。OK
  • 打赏
  • 举报
回复
TIdURI 有个Protocol属性是必输的。不知道是什么值
andwo 2013-06-18
  • 打赏
  • 举报
回复
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;
sololie 2013-06-18
  • 打赏
  • 举报
回复
自带的indy就有

uses
  IdURI;

begin
  str := TIdURI.URLEncode(url);
  str := TIdURI.URLDecode(url);
end;
  • 打赏
  • 举报
回复
我是在开发,用delphi7,api方式接入淘宝、拍拍、京东、1号店等电商平台, 实现订单下载和发货单号修改时,遇到这个问题的。

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧