`
kanwoerzi
  • 浏览: 1668918 次
文章分类
社区版块
存档分类
最新评论

struts,ajax乱码解决方案

 
阅读更多

struts,ajax乱码解决方案

转载:http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html
作者:errorfun


乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的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 作为编码。

2
、文件的编码
--虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。
文件编码最常使用的有两种:ANSIUTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPADECLIPSENOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好;而在ECLIPSE中,只要稍微设置一下就行了,打开首选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的文件类型,然后在下方的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1027" style="WIDTH: 459.75pt; HEIGHT: 425.25pt" type="#_x0000_t75" alt=""><imagedata o:href="http://errorfun.bokee.com/inc/eclipse.png" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata></shape>



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

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

<shape id="_x0000_i1028" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>request.setCharacterEncoding(encoding);

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

<shape id="_x0000_i1029" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape> < filter-mapping >
<shape id="_x0000_i1030" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>
< filter-name > SetCharacterEncoding </ filter-name >
<shape id="_x0000_i1031" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>
< servlet-name > * </ servlet-name >
<shape id="_x0000_i1032" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>
</ filter-mapping >

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

<shape id="_x0000_i1033" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>< init-param >
<shape id="_x0000_i1034" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>
< param-name > encoding </ param-name >
<shape id="_x0000_i1035" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>
< param-value > UTF-8 </ param-value >
<shape id="_x0000_i1036" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>
</ init-param >

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

<shape id="_x0000_i1037" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape><% @pagelanguage = "java"contentType = " text / html;charset = UTF - 8 "
<shape id="_x0000_i1038" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>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的经典请求代码

<shape id="_x0000_i1039" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>xmlhttp.open("post",url,async);
<shape id="_x0000_i1040" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>xmlhttp.setRequestHeader("Content-Type","text/html");
<shape id="_x0000_i1041" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>xmlhttp.send(params);


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

<shape id="_x0000_i1042" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>contentType="text/html;charset=UTF-8"


现在知道问题了吧,所以我们要把第二句代码改为:

<shape id="_x0000_i1043" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>xmlhttp.setRequestHeader("Content-Type","text/html;charset=UTF-8");<shape id="_x0000_i1044" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>


最后别忘了在返回数据时也设置上:

<shape id="_x0000_i1045" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>response.setContentType("text/xml");
<shape id="_x0000_i1046" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>response.setCharacterEncoding("UTF-8");


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

<shape id="_x0000_i1025" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>response.setContentType("text/html");
<shape id="_x0000_i1026" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""><imagedata o:href="http://www.blogjava.net/Images/OutliningIndicators/None.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif"></imagedata></shape>response.setCharacterEncoding("UTF-8");


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

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

分享到:
评论

相关推荐

    Ajax乱码解决方案(docx)

    3. **JSP和Struts的乱码解决方案** - 使用过滤器(如`SetCharacterEncodingFilter`)设定请求和响应的编码为UTF-8,确保数据在传输过程中不会出现乱码。 - 对于JSP页面,可以在页面顶部添加`;charset=UTF-8" %&gt;`来...

    AJAX乱码解决大全.doc

    在探讨AJAX乱码解决之道前,我们首先来了解一下几种常见的编码格式: - **UTF-8**:全球最广泛使用的编码格式之一,支持所有语言文字,包括中文,采用变长字节表示,具有良好的跨平台兼容性和高容错性。 - **GBK**...

    奇怪的struts2的中文乱码问题及解决.docx

    本文将深入探讨一个关于Struts2在Internet Explorer(IE)浏览器中出现中文乱码的奇怪问题及其解决方案。 首先,中文乱码问题通常涉及到几个关键因素:数据库编码、开发文件编码和网页的Content-Type编码。在确保这...

    Ajax FireFox IE 乱码兼容问题

    在IT领域,特别是Web开发中,...通过上述解决方案和优化建议,可以有效避免Ajax请求中的乱码问题,提高Web应用的稳定性和用户体验。在实际开发中,应始终关注字符编码的细节,确保数据在传输过程中的正确性和一致性。

    使用prototype.js发送ajax get请求中文参数乱码解决

    本文将深入探讨这个问题,并提供解决方案。 首先,我们需要了解HTTP协议中的编码概念。在HTTP请求中,GET请求的参数通常包含在URL中,而URL是遵循特定编码规则的,即`application/x-www-form-urlencoded`编码。默认...

    STRUTS+AJAX+JSP 请求到后台乱码问题解决方法

    在开发Java Web应用程序时,尤其是使用STRUTS、AJAX和JSP的组合时,可能会遇到请求参数在传输过程...同时,了解其他相关的解决方案,如使用过滤器进行编码转换,或者在特定的Action类中进行手动解码,也是十分重要的。

    struts乱码讲解

    ### Struts乱码问题详解与解决方案 #### 一、引言 在Web开发过程中,特别是在使用Struts框架进行开发时,经常会遇到字符编码的问题,尤其是中文字符的乱码问题。本文将详细介绍Struts中常见的乱码现象,并提供具体...

    解决网页乱码.zip

    首先,我们来看"jsp,struts,javascript,ajax乱码解决方案(转载)_安装过滤器.txt",这可能是指在Struts框架中使用JavaScript和Ajax进行交互时遇到的乱码问题。在Struts框架中,可以通过设置Filter来统一处理请求和...

    java前后台(含数据库)乱码大综合

    Java前后台及数据库乱码问题是一个常见的开发难题,涉及到字符编码的多个环节。本文将针对Struts2文件下载乱码、Ajax中文参数乱码、Servlet响应...同时,使用过滤器可以提供一种全局的解决方案,减少重复的编码设置。

    java文件JSP文件乱码汇总

    本文将深入探讨Java与JSP文件乱码的问题,提供一系列解决方案,确保数据正确无误地在不同平台和系统之间传递。 #### 一、统一字符集设置 **问题描述**:在项目开发中,由于Java默认使用UTF-8编码,但在实际操作中...

    精通Java Web整合开发(JSP+AJAX+Sturts+Hibernate)

    Struts是一个基于MVC架构的Java Web框架,它提供了控制层的解决方案。Struts的核心组件包括Action类、配置文件(struts-config.xml)以及一系列拦截器(Interceptor)。其主要功能有: 1. **请求调度**:通过Struts...

    java中文乱码终极处理方案.docx

    Java中文乱码问题一直是开发者们面临的一大挑战,无论是早期的JSP、STRUTS,还是现在的AJAX,乱码问题始终困扰着程序员。不过,实际上,很多问题的根源并不在于编程语言或框架本身,而是对编码和文件处理的误解。...

    北京中科信软AJAX培训

    还有异常处理机制、中文乱码问题及其解决方案等内容,这些都是在进行AJAX编程时需要考虑的实际问题。 课程还提到了DWR(Direct Web Remoting)框架,这是一个用于简化Ajax开发的Java库,它可以帮助开发者快速地将...

    Struts2+Spring+Hibernate+ExtJS开发实例.pdf

    4. **ExtJS**:ExtJS是一个基于JavaScript的前端框架,提供了一套完整的企业级RICH UI解决方案,包括表格、树、网格、图表等丰富的UI组件,以及AJAX、DOM和HTML操作工具,适用于构建复杂的Web应用。 #### 三、集成...

    ssh框架乱码过滤器Filter

    SSH框架,全称为Struts2、Spring和...同时,对于不同的数据提交方式,如表单和JS,需要采取相应的解决方案。在实际开发中,确保整个数据传输过程中的字符编码一致性至关重要,这能有效避免乱码问题,提高用户体验。

    Jquery、Ajax、Struts2完成定时刷新的方法

    关于存在的问题,当`out.print()`包含中文字符时可能出现乱码,解决方案通常是在服务器端和客户端都确保字符编码一致。在Struts2 Action中,已经设置了响应编码为UTF-8,但前端页面也需要设置正确的字符编码。在HTML...

    ajax请求返回的数据看不到回调函数没有执行也没报错

    在Web开发中,AJAX(Asynchronous ...理解这些问题的解决方案有助于优化AJAX请求的使用,提高Web应用的性能和用户体验。在实际开发中,确保对前端和后端的数据处理有深入的理解,以便更有效地排查和解决问题。

Global site tag (gtag.js) - Google Analytics