中文乱码问题

来源:互联网 发布:sql having语法 编辑:程序博客网 时间:2024/04/27 14:03

 

<!-- /* Font Definitions */ @font-face{font-family:Wingdings;panose-1:5 0 0 0 0 0 0 0 0 0;mso-font-charset:2;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:0 268435456 0 0 -2147483648 0;}@font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:15.6pt;}div.Section1{page:Section1;} /* List Definitions */ @list l0{mso-list-id:781732212;mso-list-type:hybrid;mso-list-template-ids:1537641596 1319779030 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}@list l0:level1{mso-level-text:%1、;mso-level-tab-stop:18.0pt;mso-level-number-position:left;margin-left:18.0pt;text-indent:-18.0pt;}@list l0:level2{mso-level-number-format:alpha-lower;mso-level-text:"%2/)";mso-level-tab-stop:42.0pt;mso-level-number-position:left;margin-left:42.0pt;text-indent:-21.0pt;}ol{margin-bottom:0cm;}ul{margin-bottom:0cm;}-->

中文乱码问题(STEPONE BY ONE

 

中文乱码应该是Web开发中常遇到的问题,也是很头疼的问题。每一次到了编程的时候,我总是重新Google搜索解决方法。为了避免不必要的时间浪费,我大致总结了Web编程下的中文乱码解决方法,方便以后自己查阅。方法很多,这里主要就设计一个设计方案,想了解更多的请GOOGLE,下面以UTF-8为例:

 

1、 中文问题的由来。要想解决问题,首先应该认识问题。


       Java
的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,JavaJSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。

       首先Java(包括JSP)源文件中很可能包含有中文,而JavaJSP源文件的保存方式是基于字节流的,如果JavaJSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@page contentType="text/html;charset=GBK"%><%@ pagecontentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

Java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java程序与这些媒介交互时就会发生字符(char)与字节 (byte)之间的转换,例如从页面提交表单中提交的数据在Java程序里显示乱码等情况,与Tomcat服务器交换很容易产生乱码,因为默认的处理是以 ISO-8859-1字符集,如果我们处理的是中文的字符就会产生问题。

2、 基本设置。这些是最基本的设置,如果脱离了这些设置,那你再往下设计也是白费力气的。

THML编码。页面<head></head>标签中添加<metahttp-equiv="Content-Type" content="text/html;charset=utf-8"/>
JSP
编码。在文件头中添加<%@ page language="java"pageEncoding="utf-8"%>

3、 过滤器设计。通过过滤器来过滤所有的消息请求和响应。
配置web.xml

<web-app ……>

    <filter>

      <filter-name>EncodingFilter</filter-name>

     <filter-class>com.apj.web.filter.EncodingFilter</filter-class>

      <init-param>

         <param-name>encoding</param-name>

         <param-value>utf-8</param-value>

      </init-param>

    </filter>

    <filter-mapping>

       <filter-name>EncodingFilter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

</web-app>

 

       设计过滤器:

import javax.servlet.Filter;

 

public class EncodingFilter extends HttpServlet implements Filter {

   

    private String encoding;

   

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

 

       servletRequest.setCharacterEncoding(encoding);

       chain.doFilter(servletRequest, servletResponse);

    }

 

    public void init(FilterConfig config) throws ServletException {

       this.encoding = config.getInitParameter("encoding");

    }

}

 

4、 数据库编码。以mysql数据库为例:
一般数据连接语句URL
jdbc:mysql://localhost:3306/database name?useUnicode=true&characterEncoding=utf8

 

Hibernate中设计:

hibernate配置文件(hibernate.cfg.xml)中,加上属性

<property name="connection.useUnicode">true</property>

<property name="connection.characterEncoding">UTF-8</property>

 

当然在hibernate中你也可以用第一种方法,直接改变url连接方式,而不添加属性。不过在这个环节中我出现过一个问题,url要设计为jdbc:mysql://localhost:3306/databasename? characterEncoding=utf8才可以。userUnicode属性不要。

最好你设计数据库时定好编码方式为utf8,这样保持一致,如CREATEDATABASE MTR_DB DEFAULT CHARACTER SET utf8。如果已经设计好,就改变其编码方式。

 

以上我们通过设计完成了*jspßà*.java *.java ßà Database环节的编码转换,如果还有问题,请到下面环节。

 

5、 测试和检查乱码根源。开始看这里前,你确定你的测试是在重启应用服务器后开展的??

 

     这个环节我不再说怎么转化了,如果还出现问题,你在这里也找不到答案了,请你GOOGLE其它帮助吧。我这里只要是教你发现问题出现在哪里。
    
第一节中也说过了,乱码出现只要是因为两个环节的编码转换问题,只要我们确保了,对症下药,相信成功也不远了。

 

a)        *.jspà *.java :在servletStrutsaction中读取jsp页面传递过来的值为中文的参数(属性)。然后直接输出。如果显示正常,拿就证明了问题出现在*.java ßà 数据库环节。

b)       *.javaà*.jsp :通过servlet中返回含中文的字符到*.jsp中显示,如果乱码,就是*.jsp中编码的不支持。这时不妨设置一下*.jsp页面的编码和servlet中加上:request.setCharacterEncoding("utf-8");   response.setCharacterEncoding("utf-8")

c)       *.java ßàdatabase :如果上边都没问题在来做servlet到数据库环节的测试。(略)

原创粉丝点击