kbmMWEncodeEscapes 中汉字编码的问题及解决办法
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 中汉字编码的问题及解决办法的更多相关文章
- iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)
问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Font ...
- 虚拟机中不能连接usb设备解决办法
虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...
- Aasible中cryptography兼容性报错解决办法
Aasible中cryptography兼容性报错解决办法 1 Ansible中使用ansible --version查看版本,报错信息如下: ERROR! Unexpected Exception, ...
- windows10中git-bash闪退的解决办法
windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...
- SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法
.NET 中 SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法: 一. 1.将项目逐个进行编译, ...
- RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法
如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...
- iOS cocopods安装使用和安装过程中遇到的问题及解决办法
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- MyEclipse迁移过程中Tomcat版本不一致的解决办法
MyEclipse迁移过程中Tomcat版本不一致的解决办法 下面就是在MyEclipse2013迁移被Tomcat6.0X绑定的项目迁移到MyEclipse2014 Tomcat8.0X,报如下pr ...
随机推荐
- 21OGNL与ValueStack(VS)-静态方法访问
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在LoginAction中增加如下方法: public static Str ...
- Spring MVC 支持的原生API参数
HttpServletRequest HttpServletResponse HttpSession java.security.Principal Local InputStream OutputS ...
- hibernate hql limit的实现方式
query.setFirstResult(startIndex);//开始索引query.setMaxResults(maxSize);//取几条 如 limit 1,5HQL:query.setFi ...
- libUpnp缓冲区溢出、拒绝服务等漏洞分析
该漏洞存在于UPnP™设备的便携式SDK中,也叫做 libupnp.这个库是用来实现媒体播放(DLAN)或者NAT地址转换(UPnP IGD).智能手机上的应用程序可用这些功能播放媒体文件或者利用用户 ...
- TortoiseGit 使用 HTTP 方式每次 PUSH 无需输入密码的方法
由于 BitBucket 被墙,导致使用时只能用HTTPS代理的方式,但TortoiseGit貌似没有记忆密码的功能,以至于每次push时都要求输入密码,很是麻烦!在网上搜到的保存密码的方式也有点笨. ...
- springboot+jsp 遇到的坑
springboot 使用jsp: 1,修改配置文件, spring: mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp 2,pom 加入: <dep ...
- DirectShow 制作在Unity3D中可以设置进度的视频播放插件
如果想在Unity3D中去播放视频文件,那么最方便的方法就是使用它自带的MovieTexture. 可以实现简单的视频播放功能. Play Pause Stop. 有也只有这三个功能, 如果你想要一 ...
- 软件工程导论九月26号Homework
习题3 (1)数据流图 (2)实体关系图ER 习题6
- mysql安装笔记-rpm
基本内容: 1.需要解决两个依赖 2.需要解决一个包冲突 3.安装mysql服务,以及客户端client 4.修改root的随机密码 5.授予root用户,从任何机器访问任何数据库的任何表的权限 1. ...
- springboot分环境打包(maven动态选择环境)
分环境打包核心点:spring.profiles.active pom.xml中添加: <profiles> <profile> <id>dev</id> ...