kbmMWEncodeEscapes 是kbmmw 里面的一个函数,用来对URL 中的汉字进行编码,例如

http://127.0.0.1/getname?name=春节,由于'春节'是汉字,浏览器向台发送请求时,会把这个连接转会为

http://127.0.0.1/getdata?name=%B4%BA%BD%DA

而kbmMWEncodeEscapes 就是实现转换的函数,但是由于D2009 以后,delphi 支持unicode。导致kbmMWEncodeEscapes

在转换汉字时出现问题,不能正常转换。

因此需要修改,经过修改后代码变成以下:

function kbmMWEncodeEscapes(const AString:string):string;
var
i,l:integer;
sb:TkbmMWStringBuilder;
B: TBytes;
begin
B:=TEncoding.ANSI.GetBytes(AString);
sb:=TkbmMWStringBuilder.Create;
try
l:=Length(b);
for i:=0 to (l-1) do
begin
if chr(b[i])=' ' then
begin
sb.Append('+');
continue;
end;
if not (chr(b[i]) in ['a'..'z', 'A'..'Z', '0'..'9', '_']) then
begin
sb.Append('%'+IntToHex(Ord(B[I]),2));
continue;
end;
sb.Append(chr(b[i]));
end;
Result:=sb.ToString;
finally
sb.Free;
end;
end;

同样,由于解码函数也要进行相应的变化

function kbmMWDecodeEscapes(const AString:string):string;
var
i,k,l:integer;
B: TBytes;
begin
l:=Length(AString);
if l<=0 then
begin
Result:='';
exit;
end;
setlength(b,l);
i:=1;
k:=0;
repeat
if AString[i]='+' then
begin
b[k]:=ord(' ');
inc(i);
inc(k);
end
else if AString[i]='%' then
begin
b[k]:=(Hex2Dec[ord(AString[i+1]) and $1F] shl 4)
+Hex2Dec[ord(AString[i+2]) and $1F];
inc(i,3);
inc(k);
end
else
begin
b[k]:=ord(AString[i]);
inc(i);
inc(k);
end;
until i>l;
setlength(b,k); result:=TEncoding.ANSI.GetString(b); end;

其实,以上的转换是把汉字转换成对应windows codepage 的ansic 码值,为了更通用的目的

可以使用以下函数进行编码:

function URIEncode(const S: string ; Encoding : TEncoding): string;
cURLUnreservedChars = ['A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.', '~'];
var
I: Integer;
B: TBytes;
begin
result:='';
B:=Encoding.GetBytes(S);
for I := Low(B) to High(B) do
begin
if CharInSet(Chr(B[I]), cURLUnreservedChars) then
Result:=Result+WideChar(B[I]) else
Result:=Result+'%'+IntToHex(Ord(B[I]),2);
end;
end;

这个函数,你可以对 string 进行各种编码。以适合程序的应用。

												

kbmMWEncodeEscapes 中汉字编码的问题及解决办法的更多相关文章

  1. iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】

    在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...

  2. MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)

    问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Font ...

  3. 虚拟机中不能连接usb设备解决办法

    虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...

  4. Aasible中cryptography兼容性报错解决办法

    Aasible中cryptography兼容性报错解决办法 1 Ansible中使用ansible --version查看版本,报错信息如下: ERROR! Unexpected Exception, ...

  5. windows10中git-bash闪退的解决办法

    windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...

  6. SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法

    .NET 中 SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法: 一. 1.将项目逐个进行编译, ...

  7. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法

    如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...

  8. iOS cocopods安装使用和安装过程中遇到的问题及解决办法

    在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...

  9. MyEclipse迁移过程中Tomcat版本不一致的解决办法

    MyEclipse迁移过程中Tomcat版本不一致的解决办法 下面就是在MyEclipse2013迁移被Tomcat6.0X绑定的项目迁移到MyEclipse2014 Tomcat8.0X,报如下pr ...

随机推荐

  1. 笔记本 T450的鼠标经常不灵

    T450的鼠标经常不灵,鼠标总感觉有延迟. 换了鼠标也是这样. 有人反应说是USB断电, 使用的是省电模式,在设备管理>鼠标>电源选项>节电模式 勾去掉就可以了, 但是我的节点模式是 ...

  2. display_css

    display所有可选值: none block inline inline-block inherit initial unset compact & marker list-item ru ...

  3. HTTP状态码 解析

    原文地址:HTTP状态码:400500错误代码(个人总结)作者:lining2008net 一些常见的状态码为: 200-服务器成功返回网页 404-请求的网页不存在 503-服务不可用 详细分解: ...

  4. storm集群相关资料

    1. Storm集群组件 Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node).其分别对应的角色如下: 主控节点(Master Node)上运行一个被称为N ...

  5. oracle ITL(事务槽)的理解

    一.ITL描述: ITL(Interested Transaction List)是Oracle数 据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag, ...

  6. linux sleep用法

    应用程序:#include <syswait.h>usleep(n) //n微秒Sleep(n)//n毫秒sleep(n)//n秒驱动程序:#include <linux/delay ...

  7. mongodb根据子项中的指标查找最小或最大值

    假设students集合中有这样的数据: { "_id" : 1, "name" : "Aurelia Menendez", "s ...

  8. sqlserver批量导出存储过程、函数、视图

    select text from syscomments s1 join sysobjects s2 on s1.id=s2.id  where xtype = 'V' xtype V   视图 P  ...

  9. java内存模型:简单理解

    1.Java内存模型(Java Memory Model,JMM) 2.JMM定义了线程和主内存之间的抽象关系: 线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地 ...

  10. 第八章 高级搜索树 (xa3)红黑树:插入