推荐给好友 上一篇 | 下一篇

探讨struts,ajax乱码解决方案


声明
  • 声明: 1、任何网站转载本站点内容时需注明来自JAVA-CN.COM,否则我们有权将根据《互联网著作权行政保护办法》追究其相应法律责任; 2、JAVA中文站社区刊登此文只为传递信息,并不表示赞同或者反对.
 乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UTF-8无法使用中文啊什么的,其实这里面被骂的产品中其实99%以上是对中文支持非常好的,而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行,怎么可能对中文支持不了呢,下面就开始一一帮大家解决这些问题。

8@4F%Q8n-kA  1 、编码

7LJ5m y8J J

_r{&W F{[N  -- 想要解决好中文问题,对编码肯定是不能一概不懂了,编码是解决中文乱码问题的根本。JAVA中文站社区门户)rjL!\q

/x4fOp5f%O1HL;Dg  编码比较常用的有: UTF-8 , GBK , GB2312 , ISO-8859-1 ,除了 iso-8859-1 之外的其它三个编码都能很好的支持中文,但它们都兼容 ISO-8859-1 的编码(就是说无论编码怎么改变,只要是ISO-8859-1中的字符,永远不会出现乱码)。

a/R3]1w#B}[

)B~2M5s5y)z`G  这四种编码中, GB2312 是中国规定的汉字编码,也可以说是简体中文的字符集编码 ; GBK 是 GB2312 的扩展 , 除了兼容 GB2312 外,它还能显示繁体中文,还有日文的假名 ; 而 UTF-8 虽然也支持中文,但却与GB码不兼容(编码值不同)。 UTF-8 使用的是可变长的UNICODE编码,编码可能是1位16进制(即 ISO-8859-1中的字符,其编码也是相同的)也有可能是2位或3位的16进制。 UTF-8 的优点是:JAVA中文站社区门户0M2xBK |5O

JAVA中文站社区门户co"m,_+qT1L.x3\

  1 、与CPU字节顺序无关,可以在不同平台之间交流。JAVA中文站社区门户]$oNX9}(]8@ K1jT8|

JAVA中文站社区门户'E(aw3_X;Z:l6`

  2 、容错能力高,任何一个字节损坏后,最多只会导致一个编码码位损失 , 不会链锁错误

`!v$Zer\ Z JAVA中文站社区门户%B!V9~1[oZC.t:~

  ( 如 GB 码错一个字节就会整行乱码 ) ,所以在国际化处理中基本都是建议使用 UTF-8 作为编码。

0h,W#}{2x8IN'~ JAVA中文站社区门户#|tzk3L5m

  2、文件的编码

#L5z2{MZi9fT

.c`i(|G4C+ip  虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。JAVA中文站社区门户 R]z+B|\

JAVA中文站社区门户4A$K E S,W

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

"h~k:X@1HZ)Y JAVA中文站社区门户e Z4vJ%SrE

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

4aZX9kd8U{ JAVA中文站社区门户 ?te c~;@x b

  3、JSP,STRUTS等的中文乱码解决方案

"q"G.vx3LU

:cdL_$y l  其实解决的方法只有一个: request.setCharacterEncoding(encoding);JAVA中文站社区门户;Ec0QA m1d

JAVA中文站社区门户oMIU`(B,f&`z

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

0s wu7C;e< filter-mapping >JAVA中文站社区门户M&X eh;?(t-A

JAVA中文站社区门户Q$Jg2Hk$s!y:U

   < filter-name > Set Character EncodingJAVA中文站社区门户Xk1[m8W9ZH;V8u#O

I-gYa1Hne:W   < servlet-name > *JAVA中文站社区门户z-R;crXI

JAVA中文站社区门户![&`t kh+|d]o(a

  JAVA中文站社区门户m'y$E1sM{+yL

JAVA中文站社区门户l^v^ bTR7`6H

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

C6F?;Rl]9f JAVA中文站社区门户sU^#dc!D

   < init-param >

x5[0Z:F;P

6Kk8nfL   < param-name > encodingJAVA中文站社区门户U&|E9B.Ya3\;i9P

2Dr m]7fw1hj   < param-value > UTF-8JAVA中文站社区门户(J5XQy&V&d4R5GKj

JAVA中文站社区门户_+vg"gJ7X

  

$i.r3ncj7j}0|GyPP JAVA中文站社区门户aT8_R:^^"]$HBE

  当然,最重要的是要记得根据前面所说的方法,改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。

bk:XKK8rlf!V!M

)ff2f.J"w#EE  而在JSP内容中,还是使用如网上教程所说的那种技俩,在所有页面的页首加入:JAVA中文站社区门户 G*FN/Zw/qe+f

Z5RM9y0b  

7IA1m7YTc4W

+Q\.OQ!x  至此,相信JSP,ACTION都不太可能出现乱码了。JAVA中文站社区门户u)Qv;~+h

z-B6O@[(| D]  4、资源文件的乱码解决方案JAVA中文站社区门户kS8w:S_Pz4P f

JAVA中文站社区门户ZY`.ko#r.|5L-e

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

JAVA中文站社区门户\ y4V/y`,_

  5、调用JS时,JS内容乱码的解决方案。

R(M@,q#do.P JAVA中文站社区门户~(mC i@

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

JAVA中文站社区门户$bM.a`)k0z%B

 6、AJAX提交数据乱码,返回数据乱码的解决方案JAVA中文站社区门户$j%y9K$E9kM jSy

JAVA中文站社区门户5v i*E R2g#Z

  随着AJAX的流行,乱码问题也开始困扰着许多刚开始使用它的程序员,幸好我之前对JSP乱码有过一点研究,在遇到AJAX后,并没有给我带来多大的困扰,在此将我的一些心得共享给大家。JAVA中文站社区门户 pG7ri)X%s$I(uAQ(T

K1W2Fr\ R/^D;h$Y  万变不离其宗,AJAX的乱码问题自然跟编码有关了,其实很多人跟我一样想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的,讨厌的乱码再一次出现在你眼前。在你试了N多种方法,包括JS自身的escape,unescape方法后,你发现乱码仍然猖狂地出现在屏幕上。

7c5rC wP'kn dc S4N#z7q JAVA中文站社区门户b B B3f O6c9n!Hp

  其实在试过这N多方法后,很多人都没发现,解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码JAVA中文站社区门户&_ XKxuOG

7k\Do#]5t;r9ku,L  xmlhttp.open( "post", url, async );

:K#Y\[g#B v V JAVA中文站社区门户N7r'i5X6`\

  xmlhttp.setRequestHeader( "Content-Type", "text/html" );JAVA中文站社区门户8cz~ n"[fN

\t)]V/n2s  xmlhttp.send( params );JAVA中文站社区门户6g;yVN S4^0f li2a

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

]/Z dBCD!d JAVA中文站社区门户0WL?@%H

  contentType="text/html; charset=UTF-8"JAVA中文站社区门户 r6S'wG&|M6?2K5@D

*gY,v3T.s4I  现在知道问题了吧,所以我们要把第二句代码改为:JAVA中文站社区门户3J_,C v+n p$P#O0i

*u3E5a$^.^Y6y  xmlhttp.setRequestHeader( "Content-Type", "text/html;charset=UTF-8" );

){/zJ7jUzZ

#HS+~BC0Io  最后别忘了在返回数据时也设置上:JAVA中文站社区门户"YBT?^n9S)P'e

d dq!U4N I  response.setContentType( "text/xml" );JAVA中文站社区门户0tIE5`j+i2W"`2Ro

4g+EInH5cq0X  response.setCharacterEncoding( "UTF-8" );

7[R:h*[6g_1K JAVA中文站社区门户}$k9F&E4`{_

  是不是很简单,一点都不麻烦呢?

k0B#[ GM4Z(B

EK$]@.~4\)GZ  如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话:JAVA中文站社区门户!I Ez*Yn @9QHW

JAVA中文站社区门户5@K6E:lE"z0W0y&f~

  response.setContentType( "text/html" );

R|DafL(P JAVA中文站社区门户Q}(d T:g%T"YH\R

  response.setCharacterEncoding( "UTF-8" );

7Y7z r%j2o re8?

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

:}&aW#N\ uA

TAG: AJAX Ajax ajax struts Struts STRUTS 方案 乱码 探讨
 

评分:0

我来说两句

seccode