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

    1,为什么会出现乱码

         乱码的根本原因是字节和字符的问题。

         我们在大学学习c的时候,老师就有介绍字符和字节。

         字节由8个bit位表示,最早的编码是ASCII码,ASCII码是单字节的编码字符。因为单字节8个bit位对于中文字符和其他国家的字符来说根本不够用,需要更多的bit位来表示字符。我们现在常见的编码有GBK,BIG5,GB2312,UTF-8,通过编码映射表可以确定bit位和字符之间的映射关系。

        一个应用从服务端把需要展现的文字换成一段字节流传输给浏览器,浏览器把字节流组装字符展现的过程一般是这样(应用的编码是GBK):

        服务端:String text->getBytes("GBK")->byte[] bytes

        浏览端:byte[] bytes->new String("bytes","GBK") ->String text

       如果字节流处理的转换过程使用编码不一致就会出现乱码问题。

    2,常见的乱码现象

        a,提交表单的时候出现乱码(页面编码和服务端编码不一致)

          页面是jsp的时候,会经常出现的问题,这个比较容易发现和修改,只要改下jsp文件的头就可以了。

          <%@ page contentType="text/html;charset=GB2312" language="java"  %>

        b,系统之间接口调用出现乱码(如果两个应用的编码格式不一致,get和post方式都是会出现乱码问题的)

           今天遇到一个问题,系统A调用我们的http接口他们提交过来的数据是乱码,主要是因为两个系统的编码格式不一致。我们的应用是GBK,对方的是UTF-8。

           解决方法是:

               需要他们重新指定下http request的编码格式。

       c,和前端交互的时候容易出现乱码(同一个应用get方式)

           页面脚本传种中文到后台的时候会出现乱码,而且中文编码是不同的浏览器有各自的实现,后端想用 new String(“乱码”.getBytes(“GBK”),”UTF-8”)这种方式  

           去还原字符,最后得到是问号。

            前端来说最简单的解决方式是用js对页面上传输到后台的中文进行encodeURI编码,传到服务端如果是进行decode。

          (tomcat默认会先进行一次decode,所有有时候js会对中文进行2次编码)

           另外一种get方式乱码的解决方式是修改容器的encodingURI来实现。

           jboss : 修改 /server/default/deploy/jbossweb.sar/server.xml              

           <Connector port="6666" address="${jboss.bind.address}"
             maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
             enableLookups="false" redirectPort="8443" acceptCount="100"
             connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
    

       tomcat:/conf/server.xml

     <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
         redirectPort="8443" 
         URIEncoding="UTF-8" />
      
    

      

     

     

                     

     

           

        https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

        

  • 相关阅读:
    C#.NET.JSON库
    C# .NET 私钥 RSA2,SHA256,签名
    fiddler 捕捉不到代码发出去的HTTP请求
    双网卡共享上网
    json 反序列化成键值对
    C# .NET 杀进程
    docker in centos error
    深入理解磁盘文件系统之inode
    CentOS下安装高版本GCC
    Mac 使用 launchctl 定时运行程序(转载)
  • 原文地址:https://www.cnblogs.com/iusmile/p/2531262.html
Copyright © 2011-2022 走看看