问题描述:
有两段java转码代码
1:
 InputStream in = null;
 request.setCharacterEncoding("gb2312");//request.setCharacterEncoding("utf-8");
 in = request.getInputStream();
 StringBuffer sb = new StringBuffer();
 BufferedReader readin=new BufferedReader(new InputStreamReader(in));
 String message=readin.readLine();
 while((message!=null)&&(!message.equals(""))){
  sb.append(message);
  message=readin.readLine();
 }
return sb.toString().trim();
-------------------------------------------------------------------------------
2:
 InputStream in = null;
 in = request.getInputStream();
 StringBuffer sb = new StringBuffer();
 byte[] bt = new byte[1024];
 int i;
 while ((i = in.read(bt)) != -1) {
  sb.append(new String(bt, "UTF-8"));
 }
 String message = sb.toString().trim();
 return message;
 
 -----------------------------------------------------------------------------
1段代码当客户端发过来得是gb2312编码格式的字符串时,转码是正确的。
因为现在客户端发过来的是UTF-8编码格式的字符串了,
原打算把1段代码中request.setCharacterEncoding("gb2312");
改写成request.setCharacterEncoding("utf-8");就可以了。
可是测试发现这样服务器端接收的字符串就成了乱码。
只好写了2段代码。这样服务器端就不再乱码了。想请教各位高手们,
1第一段的代码为什么编码是gb2312就可以,utf-8就不可以呢?
2第二段的代码因为一次读1024个字节,当客户端传过来的字节数大于1024个字节时,会不会有这样的情况:
一个汉字(两个字节),这时1024和1025存放了一个汉字,这样就会把一个汉字的两个字节分别读了出来,进行了转码,会造成某个汉字的乱码呢?(没做过这样的测试,好奇的问一下,呵呵)请前辈们指教。

解决方案 »

  1.   

    看来是个新手啊。
    1、因为客户端发过来得是gb2312编码格式的字符串,所以接受到的数据本身是GB2312编码
    2、当然会出现,当一个汉字的两个字节读出来的ASIC是负数时,会造成这个汉字的乱码
      

  2.   

    呵呵。
    昨天请教了一下,我解决了问题,但还有点儿疑问。
    1 我已经说了,我客户端发送的确实是“UTF-8”的编码方式。
      第一种方式
    request.setCharacterEncoding("gb2312");
    request.setCharacterEncoding("utf-8"); 
    其实无论客户端发送的是gb2312或是utf-8格式的都是不起作用的。
    我客户端发送gb2312编码的字符串,我去掉request.setCharacterEncoding("gb2312");一样好用。
    如果我客户端发送utf-8编码方式的字符串,我不用添加request.setCharacterEncoding("utf-8"); 
    而把BufferedReader readin=new BufferedReader(new InputStreamReader(in)); 
    改写成 BufferedReader readin=new BufferedReader(new InputStreamReader(in,"UTF-8"));
    服务器端接收的字符串就不乱码了。原因是new InputStreamReader(in)默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。
    恰巧我系统是GBK的编码方式,他兼容GB2312标准。所以传输的是gb2312的编码也不会乱码。疑问
    request.setCharacterEncoding("utf-8"); 这句话为什么没起作用,什么时候又用到这样方式的转码呢?2这个没有实验,感谢两位的回答。所以为了避免乱码。最好还是用第一中的转码方式。
      

  3.   

    request.setCharacterEncoding设置必须位于最前
    在你使用这个request对象之前就需要设置它的字符编码,在request对象开始使用以后再设置编码是无效的
    response也是一样
      

  4.   

    比如tomcat服务器,使用request.getParameter()时,如果使用request.setCharacterEncoding()来没有指定encoding,就会用tomcat默认的字符编码ISO-8859-1来生成字符串。
      

  5.   

    比如tomcat服务器,使用request.getParameter()时,如果使用request.setCharacterEncoding()来没有指定encoding,就会用tomcat默认的字符编码ISO-8859-1来生成字符串。 -------------------------------------------------------------------
    在网上可了这样一段话
    自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。而GET请求则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码,而这位朋友使用的正好是GET请求,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。我现在还有疑问就是,我客户端发送的是post请求,我用的spring框架中的Controller来接收的数据
    代码如下:
    public ModelAndView handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception { String message = getMessage(request);
    }
    getMessage(request);就是我发的上面的代码。
    疑问就是我也是没有使用request对象时就对request.setCharacterEncoding设置啊。难道这之前tomcat还对request做了什么默认的操作么?
      

  6.   

    刚才做了个测试,更改了我tomcat的编码方式
     <Connector port="8080"  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
       enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"                 connectionTimeout="20000" 
    disableUploadTimeout="true" URIEncoding="UTF-8"/>然后用了第一种的转码方式
    并设置了request.setCharacterEncoding("utf-8"); 
    ServletInputStream in = request.getInputStream (); 
    StringBuffer sb = new StringBuffer();
    byte[] bt = new byte[1024];
    int i;
    while ((i = in.read(bt)) != -1) {
    sb.append(new String(bt));
    }这样还是乱码。不是tomcat编码的错误。
    我确实是在使用这个request对象之前就需要设置它的字符编码,难道spring框架的问题?