乱码问题
2017-01-20 12:03 绿贝 阅读(317) 评论(0) 编辑 收藏 举报发送http的post请求时,有时候会出现乱码。直接用utf8转换后依然是乱码,查阅多方资料并测试后发现需要用到URL解码。
URL解码:
java.net.URLDecoder.decode(vehicleno, "UTF-8")
上面这是java客户端的问题。
delphi客户端接收的时候,部分文字会出现部分乱码。中文后面跟数字的时候,比如'鄂999',这个鄂会变成乱码。而'鄂A999',不会出现乱码。
这个很奇怪,只有部分是乱码。
分析流程:
1,服务端给客户端返回一个'鄂888'
2,利用抓包工具,抓取java服务端返回给delphi客户端的结果。通过对比utf8的2进制,发现并无乱码。排除了服务端返回乱码的可能性,问题肯定出在客户端。
3,分析客户端
IdHttp.Request.CharSet := 'utf-8'; IdHttp.Response.CharSet := 'utf-8'; ResponseStream := TStringStream.Create('utf-8'); //问题出在这句话。 RequestList := TStringList.Create; try //Url := 'http://127.0.0.1:9000'; Url := nvip; Url := Concat(Url,route); try RequestList.Add(Concat(name,'=',value)); IdHttp.Post(Url,RequestList,ResponseStream);
//........省略
ResponseStr := ResponseStream.DataString;
ResponseStr := UTF8Decode(ResponseStr);
ResponseStream := TStringStream.Create('',TEncoding.UTF8);//替换成这句话后问题解决。
//因为已经解码了ResponseStr := UTF8Decode(ResponseStr); 这句话也去掉。
分析TStringStream的2个构造方法。
constructor Create(const AString: string); overload;
constructor Create(const AString: string; AEncoding: TEncoding; AOwnsEncoding: Boolean = True); overload;
constructor TStringStream.Create(const AString: string); begin Create(AString, TEncoding.Default, False); end;
constructor TStringStream.Create(const AString: string; AEncoding: TEncoding;
AOwnsEncoding: Boolean);
begin
FEncoding := AEncoding;
FOwnsEncoding := AOwnsEncoding and not TEncoding.IsStandardEncoding(AEncoding);
inherited Create(FEncoding.GetBytes(AString));
end;