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. 5. jdk路径配置

    path , classpath 的配置及作用? 1) PATH环境变量.作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到 ...

  2. HTML5 Canvas ( 线段端点的样式 ) lineCap

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. iframe中子页面父页面里函数互调

    在iframe中很多要用的子页面父页面函数互调的情况,下面看一下各自用法,本人写个人网站的时候用过其他场景尚未试过 子页面调父页面 function fu(){ alert('父'); } funct ...

  4. as3 分发事件无法接收

    最简单的.直接用舞台接收. 如: stage.addEventListener("ok",okH);

  5. TCP/IP知识总结(TCP/IP协议族读书笔记四)

    参考:http://blog.chinaunix.net/uid-26275986-id-4109679.html 继续!TCP的流量控制和拥塞控制. TCP相对UDP可靠的地方在于它的拥塞控制.流量 ...

  6. HttpSession的关键属性和方法

    1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号:2.这个用户随后的所有请求都应包括这个标识号.服务器会校对这个标识号以判断请求属于哪个se ...

  7. scala 基本语法

    1.对于一个二元数组,键值对(k,v) 用map的时候,要取第一个或者第二个元素,用 _1 或者 _2表示. scala> words.take(2)res40: Array[(String, ...

  8. 本地管理表空间(LMT)与自动段空间管理(ASSM)概念

    创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management auto 定义自动段空间管理(ASSM). extent ...

  9. Spring @Qualifier

    先说明下场景,代码如下: 有如下接口: public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); ...

  10. EnumMap实现类

    从名字上看出来,EnumMap是为枚举类服务的,它的key不能为null,在创建它的时候,必须要指定一个枚举类,如: EnumMap enumMap = new EnumMap(Season.clas ...