能否实现类似java的URLEncoder.encode函数的功能,
1 对字母、数字,保持不变,
2 对".","-","*", and "_"保存不变。
3 " "转变为'+'
4
其他按照GBK或UTF-8格式转化为编码值
java里有现成的函数,Delphi高低版本,找不到这个函数
1 对字母、数字,保持不变,
2 对".","-","*", and "_"保存不变。
3 " "转变为'+'
4
其他按照GBK或UTF-8格式转化为编码值
java里有现成的函数,Delphi高低版本,找不到这个函数
解决方案 »
- 怎样控制Word的菜单,我使用的Activex+WebBrowser开发的,主菜单我自定义那下拉的二级菜单,我能否从VBA中批量自动得到呢?
- 如何使用java中的方法 将三个输入的整型数 转换成datetime型!!! 给分80
- DBGrid重画的问题
- 困惑!高手回复!
- 请教在成都的朋友.
- 请问:我设置了TabOrder:combobox1为2,edit1为3, 可当焦点在combobox1再回车时焦点不是往edit1里跑,而是跑其他地方?
- 各位老大,help me,急!
- delphi里做游戏可以用DirectX SDK吗?
- 如何做出像adob reader阅读器那样点击文件缩略图,在右边显示原文编辑的?
- 谁要crm完全开发文档和deom
- 有支持64位的BusinessSkinForm源码没?
- 用idHttp如何取得网页中的所有连接,程度报错,怎么改改?
实现订单下载和发货单号修改时,遇到这个问题的。
uses
IdURI;begin
str := TIdURI.URLEncode(url);
str := TIdURI.URLDecode(url);
end;
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;
替换成通用的特殊符号,防止分隔符和请求值中的分隔符混杂,出现解析错误。 URLEnCode,是把字符串的,数字和字母保持不变输出,其他非数字和字母,
按照不同编码,如GBK、UTF-8,得到不同的编码值。OK
http://bbs.csdn.net/topics/80149586
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。
我现在也有和你一样的问题.在java下 java.net.URLEncoder.encode(str,"utf-8") 就正常,delphi下还没找到方法
{ 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编码方式的字符串编码值