中文乱码

来源:互联网 发布:怎样装修淘宝店 编辑:程序博客网 时间:2024/04/26 16:08

转自: ttp://www.cnblogs.com/yechensi/archive/2009/09/08/1562208.html

 

一: SP文件自身内容乱码

     <%@ page language="java" pageEncoding="UTF-8"%>
     <%@ page contentType="text/html;charset=iso8859-1"%>
     <html><head><title>中文问题</title>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     </meta></head><body>    我是个好人</body>
     </html>

     三个地方的编码:pageEncoding="UTF-8contentType="text/html;charset=iso8859-1"content="text/html; charset=UTF-8"

     第一处地方的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字。

     第二处编码为解码格式。因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。也就是必须一致。而第二处所在的这一行,可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有这一行的话,“我是个好人”也会出现乱码。第一处和第二处必须一致才可以。

     第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式。出现了乱码。

 

 

二:表单提交后接收到乱码

 这是Tomcat的内部编码格式iso8859-1在捣乱。以post提交时(如果没有设置提交的编码格式)会以iso8859-1方式提交,接受的JSP却以utf-8接受从而导致乱码。或者Tomcat以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致接受页面把得到的参数以非iso8859-1编码处理时出现乱码。

 A 对接受到的字符进行解码,再转码
    String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
 B 在请求页面上开始处执行请求的编码代码,request.setCharacterEncoding("UTF-8"),把提交内容的字符集设为UTF-8。(只对post提交有效果)
 C 为了避免每页都要写request.setCharacterEncoding("UTF-8"),建议使用过滤器对所有JSP进行编码处理。这个网上有很多例子。请大家自己查阅。
 D. Get走的是url提交,在进入url之前已经进行了iso8859-1的编码处理。要想影响这个编码则需要在server.xml的Connector节点增加属性配置以控制tomcat对get方式的汉字编码:useBodyEncodingForURI="true"。这个属性控制get提交也是用request.setCharacterEncoding("UTF-8")所设置的编码格式进行编码。所以自动编码为utf-8,接受页面正常接受就可以了。但我认为真正的编码过程是,tomcat又要根据
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" disableUploadTimeout="true"URIEncoding=”UTF-8”/>
里面所设置的URIEncoding=”UTF-8”再进行一次编码,但是由于已经编码为utf-8,再编码也不会有变化了。如果是从url获取编码,接受页面则是根据URIEncoding=”UTF-8”来进行解码的。

三: 上传文件时的乱码

  上传文件时form表单设置的都是enctype="multipart/form-data"。这种方式以流方式提交文件。如果使用APACHE的上传组件,会发现有很多乱码想象。这是因为APACHE的先期commons-fileupload.jar有bug,取出汉字后进行解码。因为这种方式提交,编码又自动使用的是TOMCAT缺省编码格式iso-8859-1。但出现的乱码问题是: 句号,逗号,等特殊符号变成了乱码,汉字如果数量为奇数,则会出现乱码,偶数则解析正常。

      解决方式: 下载commons-fileupload-1.1.1.jar (这个版本的jar已经解决了这些bug)并对取出的字符进行从iso8859-1到utf-8转码。

四: Java代码的URL请求包含中文的时候,接受到的参数出现乱码

    URL的编码格式取决于上面所说的server.xml里面的URIEncoding=”UTF-8”。如果设定了这个编码格式,所有在URL里的汉字参数都必须进行编码(否则得到的汉字参数值都会出现乱码)。例如有一个链接 Response.sendDerect(“/a.jsp?name=张大维”),而在a.jsp里面直接使用String str = request.getParameter("name");得到的就是乱码。因为规定了必须是utf-8才可以。正确的写法是:Response.sendDerect(“/a.jsp?name=URLEncode.encode(“张大维”,”utf-8”);

如果不设置这个参数URIEncoding=”UTF-8”, 会怎么样呢? 不设置则使用了缺省的编码格式iso8859-1。问题又出来了:

第一就是参数值的个数如果是奇数个数,则就可以正常解析,如果使偶数个数,得到最后字符就是乱码。

还有就是如果最后一个字符如果是英文,则就能正常解析,但中文的标点符号仍出现乱码。

权宜之计,如果您的参数中没有中文标点符号,则可以在参数值最后加一个英文符号来解决乱码问题,得到参数后再去掉这个最后面的符号。

 

五: 脚本代码的URL里面包含中文,接受到的参数乱码

    脚本中进行页面转向的URL包含中文参数时,如果这个汉字参数不进行URIEncoding=”UTF-8”所指定的编码处理,则接受页面接受到的汉字也是乱码。脚本处理编码比较麻烦,必须有相应的编码脚本对应文件,然后调用脚本中的方法对汉字进行编码即可。

六: 编辑器打开JSP时显示的中文出现乱码问题

    JSP文件的存储格式可能是utf-8,而编辑器用编码格式iso8859-1打开文件即导致乱码问题。

    解决方案:假设编辑器是Eclipse,在偏好设置里面找到general-〉edidor,设置为您的文件打开编码为utf-8即可。修改后重新打开文件就不会有乱码问题了。

 

七: 当应用程序访问数据时,在入口和出口处都会有  Encoding    转换。

 

八: JDBC    Driver的字符转换  

     方法1:有些JDBC Driver如果通过JDBC    Driver    Manager设置了正确的字符集属性,则可以简单地通过设置字符集属性来解决乱码问题。


     方法2:目前大多数JDBC Driver采用本地编码格式来传输中文字符。例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。因此需要对JDBC Driver返回的字符以及要发给JDBC Driver的字符进行转换。当用JDBC Driver向数据库中插入数据时,需要先将Unicode转成Native code; 当JDBC Driver从数据库中查询数据时,则需要将Native code转换成Unicode。下面给出了这两种转换的实现:  
     String    native2Unicode(String    s)    {  
     if    (s    ==    null    ||    s.length()    ==    0)    {  
          return    null;  
     }  
     byte[]    buffer    =    new    byte[s.length()];  
     for    (int    i    =    0;    i    s.length();    i++)    {   

          if    (s.charAt(i)>=    0x100)    {  
              c    =    s.charAt(i);  
              byte    []buf    =    (“”+c).getBytes();  
              buffer[j++]    =    (char)buf[0];  
              buffer[j++]    =    (char)buf[1];  
           }  
         else    {

             buffer[j++]    =    s.charAt(i);

           }  
      }  
   return    new    String(buffer,    0,    j);  
   }  

 

 

 

一般的说,在编写代码,编译,以及运行期间都会字符数据的传递,因此需要特别小心。

情景A:

        在OS以及程序之间传递数据(尤其是multiple character sets中的数据)时便会产生乱码以及字符信息的丢失.解决这个问题的关键便是了解数据输出端和接收端使用的字符集和字符编码方式,

情景B:

         在写的时候一切正常,可是保存后再次打开文档就发现所有的中文字符都变成了乱码。这是因为在编写的时候,这些字符数据都在内存的某个stream中,可是保存的时候这个stream中的数据会被写入到硬盘,使用的就是你的开发工具默认的编码方式。如果很不幸你的开发工具默认编码方式是ISO-8859-1,中文字符信息就不能正确地存储。Eclipse中可以这样查看并修改默认字符编码方式:Project->Properties->info,这里有”default encoding for text file”。如果设置为GBK,那么编写代码并保存这关就过了。

情景C:

        对于JSP程序而言,编写完代码后就交给Container,首先它们会被转成.java文件,然后编译成.class才能提交给服务器执行。这个过程也存在字符编码问题。java编译器(javac)使用操作系统的语言环境作为默认的字符编码方式,JRE(Java Runtime Environment)也是这样。只有当编译运行环境的字符编码方式与存储源文件的编码方式相同时,中文字符才能正确地显示。否则就需要在运行时进行转码,使它们使用兼容的编码。这里的设置可以分为几个层次:操作系统层支持的语言,这是最重要的,因为它会影响JVM的默认字符编码方式,同时对字符的显示,如字体等有直接影响;J2EE服务器层,大多数服务器都可以对字符编码进行自定义的配置,例如Tomcat就可以通过web.xml中设置javaEncoding参数设置字符编码,默认是UTF-8.

情景D:

         运行时的转码,运行时期,应用程序很可能需要与外部系统进行交互,例如对数据库进行读写,对外部文件进行读写.在这些情况下,应用程序免不了要和外部系统进行数据交换。那么对于中文字符, 数据出入口的编码方式就显得特别重要了。一般外部系统都有自己的字符编码方式,我的例子中配置的MySQL就是使用的UTF-8编码。JSP页面通过设定”charset=gb2312”,