`
davidxiaozhi
  • 浏览: 241629 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

中文乱码解决方案

阅读更多

使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。 

一、初级解决方法 
通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照 gb2312 进行编码,最后得到正确的内容。示例代码如下:

http://xxx.do?ptname='我是中国人'

String strPtname = request.getParameter("ptname");

strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");
String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312"); 
具体的原因是因为美国人在写 tomcat 时默认使用 iso8859-1 进行编码造成的。 
然而,在我们的 servlet 和 jsp 页面中有大量的参数需要进行传递,这样转换的话会带来大量的转换代码,非常不便。 
二、入门级解决方法 
后来,大家开始写一个过滤器,在取得客户端传过来的参数之前,通过过滤器首先将取得的参数编码设定为 gb2312 ,然后就可以直接使用 getParameter 取得正确的参数了。这个过滤器在 tomcat 的示例代码 
jsp-examples 中有详细的使用示例, 其中过滤器在 web.xml 中的设定如下,示例中使用的是日文的编码,我们只要修改为 gb2312 即可

 

<filter>   
<filter-name>Set Character Encoding</filter-name>   
<filter-class>filters.SetCharacterEncodingFilter</filter-class>   
<init-param>   
<param-name>encoding</param-name>   
<param-value>EUC_JP</param-value>   
</init-param>   
</filter> 
 

 

过滤器的代码如下:

 

public class SetCharacterEncodingFilter implements Filter {   
// 编码的字符串   
protected String encoding = null;   
// 过滤器的配置   
protected FilterConfig filterConfig = null;   
// 是否忽略客户端的编码   
protected boolean ignore = true;   
// 销毁过滤器   
public void destroy() {   
this.encoding = null;   
this.filterConfig = null;   
}   
// 过滤方法   
public void doFilter(ServletRequest request, ServletResponse response,   
FilterChain chain)   
throws IOException, ServletException {   
// 如果使用过滤器,忽略客户端的编码,那么使用通过过滤器设定编码   
if (ignore || (request.getCharacterEncoding() == null)) {   
String encoding = selectEncoding(request);   
if (encoding != null)   
request.setCharacterEncoding(encoding);   
}   
// 传送给下一个过滤器   
chain.doFilter(request, response);   
}   
  
// 初始化过滤器   
public void init(FilterConfig filterConfig) throws ServletException {   
this.filterConfig = filterConfig;   
this.encoding = filterConfig.getInitParameter("encoding");   
String value = filterConfig.getInitParameter("ignore");   
if (value == null)   
this.ignore = true;   
else if (value.equalsIgnoreCase("true"))   
this.ignore = true;   
else if (value.equalsIgnoreCase("yes"))   
this.ignore = true;   
else   
this.ignore = false;   
}   
// 返回过滤器设定的编码   
protected String selectEncoding(ServletRequest request) {   
return (this.encoding);   
}   
}   
 

 

 

然而在 tomcat5 中,即使使用过滤器,仍然可能取得乱码,原因何在呢? 
三、高级解决方法 
这是因为,在 tomcat4 和 tomcat5 中对参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的 
在 tomcat 5 中,为了解决编码问题,tomcat 的作者作了很多努力,具体表现为在 tomcat 的配置文件 server.xml 中对 Connector 元素增加了如下的配置参数,专门用来对编码进行直接的配置 
URIEncoding 用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。 
什么是 URI 呢? 
java doc 的说明中如下说明:URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。 
也就是说,我们通过 get 方法提交的参数实际上都是通过 uri 提交的,都由这个参数管理,如果没有设定这个参数,则 tomcat 将使用默认的 iso8859-1 对客户端的内容进行编码。 
useBodyEncodingForURI 使用与 Body 一样的编码来处理 URI, 这个设定是为了与 tomcat4保持兼容,原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的,对 get 的处理通过 前面的 URIEncoding 进行处理,对 post 的内容依然通过 request.setCharacterEncoding 处理,为了保持兼容,就有了这个设定。 
将 useBodyEncodingForURI 设定为真后,就可以通过 request.setCharacterEncoding 直接解决 get 和 post 中的乱码问题。 
这样,我们可以通过在 server.xml 中设定 URIEncoding 来解决 get 方法中的参数问题,使用过滤器来解决 post 方法中的问题。 
或者也可以通过在 server.xml 中设定 useBodyEncodingForURI 为 true ,配合过滤器来解决编码的问题。 
在这里,我强烈建议在网站的创作过程中,全程使用 utf-8 编码来彻底解决乱码问题。 
具体操作如下: 
1、页面内容使用 utf-8 格式保存,在页面中加入 <mete http-equiv="contentType" content="textml;charst=utf-8"> 
2、服务器端的 server.xml 中设定 useBodyEncodingForURI = true 
3、使用过滤器,过滤器设定编码为 utf-8

四:如果有一些转码也转不过来的话,可是试试打开tomcat的server.xml,找到

 

<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" port="80" redirectPort="8443">
 

 

并在最后加上useBodyEncodingForURI="true" URIEncoding="UTF-8",如下

 

<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" port="80" redirectPort="8443"  useBodyEncodingForURI="true" URIEncoding="UTF-8">  

 

 

 五:

如果用jstl的话,可以自己写一个el的function,调用URLEncoder.encode来编码。

IE缺省对URL后面的参数是不编码发送的,但是tomat缺省是按ISO8859-1来进行URL解码,因此才会出现上述错误。好的做法是:

1、在URL参数中确保用UTF-8编码之,方法可以用js函数encodeURI(),或调用自定义的el function;

2、设置server.xml中的Connector熟悉URIEncoding="UTF-8",确保解码格式与编码格式统一;

方法四:

 

for(var i=0;i<document.links.length;i++){  
  
document.links[i].href=encodeURI(document.links[i].href);  
  
} 
 

 

 

在action中,String s=request.getParameter("s");

s=new String(s.getBytes("iso-8859-1"),"gbk");

六:js的乱码解决

1.客户端:
url=encodeURI(url);
服务器:
String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

2.客户端:
url=encodeURI(encodeURI(url)); //用了2次encodeURI 
服务器:
String linename = request.getParameter(name);
//java  : 字符解码
linename = java.net.URLDecoder.decode(linename , "UTF-8");

 

分享到:
评论

相关推荐

    jsq+mybatis+mysql中文乱码解决方案

    JSQ+MyBatis+MySQL 中文乱码解决方案 中文乱码是 JSQ、MyBatis 和 MySQL 集成时常见的问题,解决这个问题需要从多方面入手。本文将从 JSP、MyBatis 和 MySQL 三个方面来解决中文乱码问题。 JSP 中文乱码解决方案 ...

    java中文乱码解决方案和经验

    ### Java中文乱码解决方案与经验 #### 一、字节与Unicode 在Java中处理文本时,经常会遇到中文乱码的问题。这是因为Java内部使用的是Unicode编码标准,而外部数据源如文件、网络传输等通常使用的是字节流,且可能...

    FlashFXP中文乱码解决方案

    ### FlashFXP中文乱码解决方案 #### 背景与问题概述 在使用FlashFXP进行文件传输时,用户可能会遇到中文字符显示为乱码的问题。这种情况不仅影响用户体验,还可能导致重要信息无法正确读取。因此,寻找有效的解决...

    英文版Ubuntu Firefox中文乱码解决方案.docx

    英文版Ubuntu Firefox中文乱码解决方案 在英文版Ubuntu系统中,Firefox浏览器中文乱码问题是一个常见的问题。该问题可能是由于系统字体配置不当或扫瞄器设置不正确引起的。在本文中,我们将介绍解决该问题的步骤和...

    source_insight_UTF8汉字乱码解决方案

    《source_insight_UTF8汉字乱码解决方案》 在IT行业中,源代码编辑器Source Insight是一款深受程序员喜爱的工具,尤其对于C/C++等语言的开发人员来说,它强大的语法高亮、代码跳转和分析功能使得代码阅读和理解更为...

    json 中文乱码解决方案

    ### json 中文乱码解决方案 在处理JSON数据时,经常会出现中文乱码的问题,尤其是在不同编码格式间进行转换时更为常见。本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这...

    Xshell登陆Ubuntu的中文乱码解决方案.docx

    Xshell 登陆 Ubuntu 的中文乱码解决方案 Xshell 是一款 Windows 下十分优秀的远程登录 Linux 主机的工具,它提供了许多实用的功能和快捷键,帮助用户更方便地远程登录 Linux 主机。下面是 Xshell 登陆 Ubuntu 的...

    VC++编译后出现中文乱码解决方案借鉴.pdf

    ### VC++编译后出现中文乱码解决方案 #### 一、背景介绍 在使用Visual C++(以下简称VC++)进行程序开发时,经常会遇到下载或导入的代码在编译过程中出现中文乱码的问题。这种情况不仅影响了代码的可读性,也可能...

    vim中文乱码解决方案

    ### vim中文乱码解决方案 #### 一、问题背景与概述 在使用Vim编辑器时,中文乱码问题是一个常见的现象,特别是在Fedora和Ubuntu等Linux发行版中更为突出。本文将详细介绍如何解决Vim中的中文乱码问题,并提供一些...

    Debian 6中文乱码解决方案.docx

    Debian 6 中文乱码解决方案 文档概述 本文档提供了 Debian 6 中文乱码解决方案,旨在帮助用户解决 Debian 6 中文乱码问题。该解决方案分为四个步骤,分别是将宋体或新宋体复制到/usr/share/fonts/truetype/目录下...

    系统中文乱码解决方案

    ### 系统中文乱码解决方案 #### 一、引言 在软件开发过程中,中文乱码问题时常出现,尤其在数据库交互与前端展示时更为常见。本文将详细探讨解决中文乱码的方法,包括数据库编码设置、服务器配置、工程编码及程序...

    jsp+mysql中文乱码解决方案集合

    ### jsp+mysql中文乱码解决方案集合 在使用JSP结合MySQL进行Web应用开发时,中文乱码问题一直是困扰开发者的一大难题。本文将详细介绍如何在MySQL数据库层面解决中文乱码问题,并提供一系列实用的方法和技巧。 ###...

    中文乱码解决方案.rar

    在IT领域,中文乱码是一个常见的问题,尤其是在处理文本数据时。...在“中文乱码解决方案.pdf”这个文件中,应该会详细讲解这些知识点,并提供更具体的解决步骤和技术细节,帮助读者更好地理解和处理中文乱码问题。

    tomcat get提交中文乱码解决方案

    tomcat get提交中文乱码解决方案,修改tomcat server.xml 中以下为

    java中文乱码解决方案

    ### Java中文乱码解决方案 #### 一、Struts2中的乱码问题及解决方案 在Java Web开发中,尤其是使用Struts2框架时,经常会遇到中文乱码的问题。这些问题的出现通常与字符编码设置不当有关。下面详细介绍几种有效的...

    PHP+MySql中文乱码解决方案

    ### PHP+MySQL中文乱码解决方案 #### 一、概述 在使用PHP与MySQL进行Web开发的过程中,中文乱码问题是常见的一个问题。通常情况下,这主要是由于系统各部分(如PHP脚本、MySQL数据库、操作系统等)之间的字符编码...

    php中文乱码解决方案

    ### PHP中文乱码解决方案 #### 一、PHP网页的编码 **1. php文件本身的编码与网页的编码应匹配** 为了确保PHP文件正确地显示中文字符,必须保持PHP文件内部编码与网页显示编码的一致性。 - **使用GB2312编码** -...

    UE中文乱码解决方案

    解决ultraeditor打开中文文件出现乱码的情况

Global site tag (gtag.js) - Google Analytics