当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
说明:下文涉及的内容只限于对前端jsp和后台servlet的代码修改,不涉及Web容器和数据库的相关修改。
我的测试环境是:英文XP操作系统,容器采用Tomcat6,前台是jsp,后台Servlet,Ajax框架采用prototype1.6.0

Web编程中前后端乱码问题发生的根源
从前端jsp到后台的Servlet,中间传输过程中的默认编码方式是ISO-8859-1,这种编码方式是西欧字符集,包括英语,德语,丹麦语,芬兰语等,其它语言如中文日文等是不兼容的,如不经转换或是设置直接在Servlet中用request.getParameter(paramName)这种方式直接拿出来中文部分就会得到乱码,但英语,字母,数字组合成的字符串是不会变成乱码的。

常见的编码解决乱码问题的方式有
  • new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"页面字符集");
  • HttpServletRequest.setCharacterEncoding("页面字符集");
  • URLDecoder.decode(str, "UTF-8");
它们各自用在不同的场合,这里的页面字符集指GBK,GB2312,UTF-8等,它们通常和jsp页面设定的字符集(charset)一致。

如果是将form通过post方式提交,在servlet的doPost函数开头(对于Struts写在execute函数开头)写上request.setCharacterEncoding("jsp网页字符集")就可以直接用request.getParameter(paramName)直接得到文字,不需要经过再转码。这里需要注意的是form的action如果不直接写成post的话,是会以get方式提交,这时request.setCharacterEncoding就会失效。

如果不管是post还是get方式,想做一个通用方案,则可以通过new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"jsp网页编码方式")得到转码后正常的文字,这种方式只要知道网页的字符集,几乎都能还原成正确的文字,适用性很广,在Servlet和Action中很常见。

如果是Ajax提交方式,则在servlet或是action中书写request.setCharacterEncoding("jsp网页字符集")是没有效果的,经过对提交的URL用一次javascript的encodeURI函数编码后,用 new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"jsp网页字符集")可以得到正确的文字。但如果不用encodeURI函数处理提交的url则不会正确的文字。

Ajax提交中文的另一种方式可以用javascript的encodeURI函数对提交的URL进行两次编码,而后台采用URLDecoder.decode(request.getParameter(paramName), "UTF-8")得到正确的文字。

上面两种方式都借助了avascript的encodeURI函数的帮助,它能将字符串进行utf-8编码,其中,第二种方式确定性很高,推荐。

具体方式请参考下面给出的例程,里面含有12个例子,分别对应了多种情况:
http://www.blogjava.net/Files/heyang/DisorderCode2011-01-31.zip



参考文章:
深入浅出 web 编码(转载整理)
http://www.blogjava.net/heyang/archive/2011/01/26/343570.html
posted on 2011-01-30 18:07 何杨 阅读(1836) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: