zoukankan      html  css  js  c++  java
  • 乱码问题

    发送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;

  • 相关阅读:
    Java日期计算之Joda-Time
    JAVABEAN EJB POJO区别
    Android 知识体系学习路线
    Linux学习路线(尚观)
    嵌入式学习课程实战(尚观)
    嵌入式学习课程体系(尚观)
    嵌入式学习路线尚观
    C/C++的培训路线(达内)
    部分C/C++书籍
    基本路线
  • 原文地址:https://www.cnblogs.com/feiyunaima/p/6322466.html
Copyright © 2011-2022 走看看