转---解决web中文乱码

中文乱码问题是WEB应用系统当中常见的问题,网络上有很多关于这方面的解决方法,但都不是很全面。伯乐在线技术团队在这方面有一定的经验总结,这里拿出来和伯友分享。这篇文章具体的方法是针对某种环境下提出的,所以,请不要直接照搬到你的系统当中。但是,你却可以从这篇文章学习到如何解决Web系统中文乱码问题的整体思路。“授人以鱼,不如授人以渔” 这也是伯乐在线分享各种职业相关资源的真正出发点。

解决WEB系统中文乱码问题的思路

解决Web系统中文乱码问题之前,首先要知道这类问题可能由于哪些方面的原因引起(即:涉及到哪些方面),然后逐个排查,找到问题出在哪里,最后解决问题也就简单了。有些朋友可能会说,如果我是新手,根本不知道这类问题可能涉及的方面,那怎么办?我建议你请教有经验的朋友、同事 (或者搜索引擎)。幸运的是,你看到了伯乐在线的这篇文章:20:。

Web系统中文乱码问题涉及哪些方面,各个方面该如何定位和解决
中文乱码的问题归根结底是编码的问题。很多系统的默认字符集不支持中文编码,所以系统要重新设置和转换。支持中文的编码集有多种,例如:GBK, GB2312, UTF-8等。虽然,混用多种编码集有时也不会出错,不过,我仍然建议系统使用一种编码集,例如:普遍采用的UTF-8。

另外,中文乱码的问题可以从两个方向来看,存入数据乱码和取出数据乱码。认识到这点非常关键,下面就分别从这两个方面来分析:

一)存入数据乱码
1) 数据库

Web应用系统支持中文的根本是数据库要支持中文,如果发现系统保存的数据是乱码,首先要检测一下数据库是否支持中文。

如何检测:
用一条简单的SQL语句插入一条带中文的记录,再用SQL查询该记录。看看是否可以正常显示中文。如果有乱码,则说明数据库的字符集设置不支持中文。需要进行一定的设置。

如何设置:
以MySQL为例,设置数据库的字符集方法很多,可以设置Database, Table, Column

 

CREATE DATABASE testDB CHARSET latin1;123 CREATE TABLE testDB.table1( column1 CHAR(1) CHARSET utf8 ) DEFAULT CHARSET=cp1251;
 

或者直接在MYSQL的配置文件中全局设置

打开MySQL配置文件,如my.ini分别在[client],[mysql]和[mysqld]添加 default-character-set=utf8

推荐采用第二种方式。不过,无论采用哪种方式,根据我们伯乐在线的经验而言,再次强烈建议只用一种字符集。如果对同一个数据库(或者系统)采用超过一种的字符集,你很可能会遇到接踵而至的麻烦!例如:不同字符集数据表的外连接等等。(注:如果遇到UTF8出错的情况,不妨换成GBK试试,总之,请最终用一种)

设置完成后,再检测一下。如果还有问题,请查看文章底部的意外情况的解决办法

2)Web应用系统
经过合理设计的Web应用系统,一般会分为多层。就中文乱码问题而言,比较容易出问题的大多数是在下面两个层面。建议在这两个层面的出、入口分别设断点,查看输出的中文数据。(如果不能调试,那就用日志代替)

2.1) 接收HTTP请求的模块

2.1.1) Web应用容器
Web应用系统都有一个Web应用的容器(例如:应用于J2EE系统的Apache Tomcat, Weblogic 等等)。在Web应用容器当中设置字符编码可谓省时省力。Web应用服务器编码设置。以Tomcat为例,通过下面的配置,可以有效地解决URL带中文参数的问题(注:除非有特别的需要,尽量避免在参数带中文)。配置方法如下:

1 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />
2.1.2) Web系统字符集过滤器
除了中文参数之外,页面Form表单提交也会出现中文乱码。一个行之有效的办法是,在Web应用中设置字符集过滤器。关于字符集过滤器的实现请咨询一下Google. 另外,这里要特别说明的是,有时候请尽量确认一下当前的字符集编码是否正确。方法很简单,以J2EE为例,

request.getCharacterEncoding(); //显示Http请求的字符集
response.getCharacterEncoding(); //显示Http响应的字符集2.2) DAO 或 其他访问DB的模块
如果数据在传入到DAO,存入DB之前是正常的,但数据库当中的中文数据却是乱码。由于之前已经排除了DB字符集编码的问题。所以,你基本上可以肯定问题出在DAO或者DB连接这里。

2.2.1) DB连接的编码问题很常见,也很好解决。这里以JDBC为例说明一下DB连接的编码问题。

如果你应用了Web容器的DB连接池,如Tomcat DB连接池。

12345678910 打开 Tomcat安装目录下 conf/server.xml,添加以下配置。 <Host> ...... <Context   path="/JobBole"   docBase="JobBole"  reloadable="true"   crossContext="true"> <Resource  name="jdbc/jobbolepool"   auth="Container"   type="javax.sql.DataSource"           maxActive="1000"   maxIdle="300"   maxWait="3000"           username="***"   password="***"   driverClassName="com.mysql.jdbc.Driver"           url="jdbc:mysql://localhost:3306/jobbole?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/> </Context> </Host>
2.2.2) DAO 模块大部分源自使用了第三方的DAO。如果排除了数据库连接的问题,但中文乱码仍然存在,建议你简单地实现一个数据库存入程序,以确定是否由于第三方DAO引起的中文乱码。

关于第三方DAO的中文乱码解决方法,以Apache iBatis为例,说明一下解决的思路:

创建一个Java 类,并实现 TypeHandlerCallback
public class StringTypeHandler implements TypeHandlerCallback  (具体的细节请用Google一下)打开 Sql-map-config.xml

12345 <sqlMapConfig>  <!-- enable iBatis to handle Chinese and other special language --> <typeHandler javaType="java.lang.String" callback="com.jobbole.***.***.***.StringTypeHandler"/>  .... </sqlMapConfig>
二)取出数据显示成乱码

取出中文数据显示成乱码意思是,数据库中的中文数据没有任何问题,但从Web系统看到的中文却是乱码。定位、解决思路和存入数据乱码大同小异。可以在从数据库取出数据,至返回页面显示的各个模块调试或保存日志。基本上问题可能出在以下几个方面:

1) Web应用系统
1.1) DAO 或 DB 连接
定位很简单,直接调试或记录一下从DB取出的数据。如果是乱码,则可能是因为DAO 或数据库连接引起。解决办法参见 “2.2) DAO 或 其他访问DB的模块”

1.2)响应HTTP请求
方法和2.1.2) Web系统字符集过滤器类似。

2) 页面自身
页面自身必须支持中文。检测方法很简单,直接在页面当中写入中文,然后查看页面是否正常显示了中文。如果没有正常显示,参照以下页面编码设置方法(JSP为例):

123 <%@ page pageEncoding="utf-8" language="java"%> .... <meta http-equiv="content-type" content="text/html; charset=utf-8" />
其他注意事项

1) 操作系统

非中文操作系统的服务器也可以运行中文的系统。前提是要恰当地设置数据库、应用层等系统模块字符集编码格式。当然,如果你正着手解决系统中文乱码的问题,如果条件允许,我们建议你用中文的操作系统来定位、调试,或者将你OS的语言设置为中文。在中文的环境下解决中文乱码问题更为方便 (否则,你调试时看到全是乱码,以至于你很难分辨是OS引起的,还是系统自身的问题)。

下面就以Windows XP为例说明一下OS的语言设置过程。

打开 控制面板 -> 区域和语言选项
在弹出对话框中的  区域选项 和 高级 中分别选择中文。2) 开发工具(IDE)
将IDE自身的字符集设置为UTF-8是一个明智之举。这样可以让你调试的同时,从IDE的控制台可以直接查看调试结果。从而可以方便地分辨出中文乱码是由于哪个模块引起。

以Java开发IDE MyEclipse为例,设置字符集的方法如下:

打开  Windows -> Preferences...
在弹出窗口中 General -> Workspace
找到 Text file encoding, 并选择  Other [UTF-8]意外情况的解决办法


  我们可以肯定这篇文章不能100%解决所有Web系统的中文乱码问题。如文章开头所讲的,它重点讲的是思路,而非100%全面覆盖的解决方案。如果你的WEB系统的中文乱码问题仍未解决,我们建议你咨询更有经验的同事、朋友。由于我们的水平有限,如果你发现文章任何的错误,欢迎在伯乐在线论坛或博客留言提出。我们将会进一步完善这篇文章,让更多的开发人员不再为Web系统的中文乱码而发愁。

转载请注明来自:伯乐在线

 

转载于:https://www.cnblogs.com/kaka-bing/archive/2012/06/04/2534258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值