`
richardeee
  • 浏览: 18357 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[转帖]struts,ajax乱码解决方案

阅读更多

原帖地址:
http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html
乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UTF-8无法使用中文啊什么的,其实这里面被骂的产品中其实99%以上是对中文支持非常好的,而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行,怎么可能对中文支持不了呢,下面就开始一一帮大家解决这些问题。

1
、编码
      --
想要解决好中文问题,对编码肯定是不能一概不懂了,编码是解决中文乱码问题的根本。
      
编码比较常用的有: UTF-8 GBK GB2312 ISO-8859-1 ,除了 iso-8859-1 之外的其它三个编码都能很好的支持中文,但它们都兼容 ISO-8859-1 的编码(就是说无论编码怎么改变,只要是 ISO-8859-1 中的字符,永远不会出现乱码)。
     
这四种编码中, GB2312 是中国规定的汉字编码,也可以说是简体中文的字符集编码 ; GBK GB2312 的扩展 , 除了兼容 GB2312 外,它还能显示繁体中文,还有日文的假名 ; UTF-8 虽然也支持中文,但却 GB 码不兼容(编码值不同) UTF-8 使用的是可变长的 UNICODE 编码,编码可能是 1 16 进制(即 ISO-8859-1 中的字符,其编码也是相同的)也有可能是 2 位或 3 位的 16 进制。 UTF-8 的优点是: 1 CPU 字节顺序无关 , 可以在不同平台之间交流。 2 、容错能力高 , 任何一个字节损坏后 , 最多只会导致一个编码码位损失 , 不会链锁错误 ( GB 码错一个字节就会整行乱码 ) ,所以在国际化处理中基本都是建议使用 UTF-8 作为编码。
<!----> <o:p>
2、文件的编码
      --虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。
      文件编码最常使用的有两种:ANSI和UTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好;而在ECLIPSE中,只要稍微设置一下就行了,打开首选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的文件类型,然后在下方的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。
</o:p>



而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理)

3、JSP,STRUTS等的中文乱码解决方案
     其实解决的方法只有一个:

 request.setCharacterEncoding(encoding);

   方法只有一种,但处理方式就多种多样了,初学者会在JSP页面上直接使用,而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了,网上有很多教程。偷懒一点的,到TOMCAT中复制就行了。在TOMCAT的目录下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 这个类,放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'

   < filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< servlet-name > * </ servlet-name >
  
</ filter-mapping >

像上面这样配置的话(可能也是网上大多教程的做法,想当年也是害苦了我),可能你只有JSP的乱码解决了,要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。

< init-param >
      
< param-name > encoding </ param-name >
      
< param-value > UTF-8 </ param-value >
</ init-param >

当然,最重要的是要记得根据前面所说的方法,改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。
而在JSP内容中,还是使用如网上教程所说的那种技俩,在所有页面的页首加入:

<% @ page language = "java" contentType = " text / html; charset = UTF - 8 "
    pageEncoding
= "UTF - 8 " %>

至此,相信JSP,ACTION都不太可能出现乱码了。

4、资源文件的乱码解决方案
      资源文件谁都知道是国际化支持不可或缺的一部分,如果资源文件都出现乱码了那还了得?其实资源文件的乱码是很好解决的,其原因也是因为使用了UTF-8做为JSP编码后,没有相应地改变资源文件的文件编码造成的,所以只要对资源文件保存的编码进行更正后,乱码问题也就解决了。当然,你的中文要使用 native2ascii 命令进行正确的转换。

5、调用JS时,JS内容乱码的解决方案。
     其实JS的乱码还是跟文件的编码有关系的,如果JS中有中文的话,那JS文件保存的编码就必须跟调用此JS的页面编码相同,否则,你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的(也是建立在前面的辛苦之下的)。

6、AJAX提交数据乱码,返回数据乱码的解决方案
     随着AJAX的流行,乱码问题也开始困扰着许多刚开始使用它的程序员,幸好我之前对JSP乱码有过一点研究,在遇到AJAX后,并没有给我带来多大的困扰,在此将我的一些心得共享给大家。
     万变不离其宗,AJAX的乱码问题自然跟编码有关了,其实很多人跟我一样想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的,讨厌的乱码再一次出现在你眼前。在你试了N多种方法,包括JS自身的escape,unescape方法后,你发现乱码仍然猖狂地出现在屏幕上。
    其实在试过这N多方法后,很多人都没发现,解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码

xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( 
"Content-Type""text/html" );
xmlhttp.send( params );

通过前面的说明,不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响,setRequestHeader并是万年不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP页面内容的编码设置,其中有这么一节:
contentType="text/html; charset=UTF-8"

现在知道问题了吧,所以我们要把第二句代码改为:
xmlhttp.setRequestHeader( "Content-Type""text/html;charset=UTF-8" );

最后别忘了在返回数据时也设置上:
response.setContentType( "text/xml" );
response.setCharacterEncoding( 
"UTF-8" );

是不是很简单,一点都不麻烦呢?
如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话:
response.setContentType( "text/html" );
response.setCharacterEncoding( 
"UTF-8" );

而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS有关系)。所以在servlet设置response的编码也是理所当然的了。

一口气把自己一年以来遇到的乱码问题和解决的方案写出来了,希望对你有所帮助。

Zou Ang 2006-12-11 11:04 发表评论
分享到:
评论

相关推荐

    转帖struts2+Spring+hibernate做的程序Demo

    bookAdmin.rar是一个人做的图书的增删改差(带分页)的程序。

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    [教程]【七大经典软件】【【图解】远离91助手和iTunes之完全解决方案】

    该教程主要针对iPhone用户,旨在帮助他们摆脱对91助手和iTunes的依赖,提供一套完整的解决方案。91助手和iTunes是常见的iOS设备管理工具,但有些用户可能因为各种原因想要寻找替代品。教程中提到的“七大经典软件”...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    我们将从安装步骤、工作原理、可能遇到的问题以及解决方案等方面进行详尽解析。 首先,让我们了解安装过程。这个插件的安装分为三个主要步骤: 1. **上传文件**:将`copyto.js`和`copyto.php`这两个关键文件复制并...

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    [转帖] 用C# Generator解决Hanoi塔问题

    【描述】中的“程序的输出结果”表明,作者不仅实现了汉诺塔问题的解决方案,还通过C# Generator展示了代码运行的实际效果。这通常意味着程序能够正确地计算出每一步的移动,并将这些移动以易于理解的形式输出。在...

    编辑人员转帖去水印工具

    本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    总的来说,"转帖工具插件 for PHPwind 7.5 正式版" 提供了一个高效且用户友好的解决方案,帮助管理者优化论坛内容的组织和管理,同时降低了操作复杂度,提升了用户体验。正确理解和使用这款插件,能有效提升 PHPwind...

    用MyEclipse8.0构建SSH框架(转帖)

    在IT行业中,SSH框架是Java Web开发中常用的三大框架,分别是Struts2、Spring和Hibernate。这些框架分别负责表现层、业务层和服务层的管理,提供了高效、灵活且可维护的开发模式。本文将详细解释如何使用MyEclipse...

    eclipse乱码+开源转码插件+批量操作

    后来和经理qq上交流了一下,领导的意思是,我们最好提供解决方案,也不要让别人太痛苦(领导看问题还是更全面的, ^_^)。 突然一想,以前都是用baidu在搜索,这次用google,找资料的命中率可能更高一点。结果运气好...

    【转帖】Extreme Presentation Method

    - **定义**:确定演讲所解决的具体业务问题,并提供解决方案。 - **重要性**:通过展示问题及其解决方案,可以有效吸引受众注意力,增强演讲的实际价值。 - **实践建议**: - 准确识别受众面临的挑战或问题。 - ...

    discuz X2转帖工具、采集工具

    X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...

    轻松转帖之突破网页复制限制宣贯.pdf

    【其他浏览器解决方案】 除了火狐,其他浏览器如搜狗、遨游和世界之窗也有类似插件或方法来解除复制限制。例如,可以寻找专为此目的设计的通用插件来安装。 【图片转文字工具】 对于不能直接复制的富媒体内容,如...

    [转帖]世界编程大赛第一名写的程序

    编程大赛通常由诸如ACM(美国计算机协会)、Google Code Jam、Facebook Hacker Cup等国际知名组织举办,这些比赛不仅考验参赛者的编程速度和准确性,更注重算法的优化、问题解决的效率以及代码的优雅性。例如,ACM-...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    总之,Html2UBBMaxcj_Softii论坛专用转帖工具是一个实用的工具,解决了HTML内容在特定论坛环境下无法正常显示的问题,极大地提高了用户在论坛交流的体验。通过了解和熟练使用这款工具,用户可以更轻松地分享和讨论...

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

Global site tag (gtag.js) - Google Analytics