代码改变世界

乱码问题

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;