关于JSP中日文乱码问题的解决

说明:由于乱码问题造成的原因可能有很多种,而且不同的环境下面,结果也不一样。
本人[闭月羞花猫]一直致力于找出一套完整的,万能的解决方案,希望各位能够共同讨论。

第一部分:
关于日文编码,目前比较使用的比较多的是Shift_js和windows-31J.

Shift_js和windows-31J的区别,参见:http://blog.csdn.net/luyang1016/archive/2007/06/14/1652469.aspx

对于一般表单提交的乱码,处理无非就是在jsp中加上3句话。

<%@ page language="java" contentType="text/html;charset=Windows-31J"%>
表示jsp的编码是 Windows-31J

<meta http-equiv="Content-Type" content="text/html; charset=SJIS">
表示jsp上固定项目,是SJIS的,固定项目既然是固定字符,一般无需用Windows-31J

<% request.setCharacterEncoding("Windows-31J"); %>
一般项目会在自己封装的 ActionServlt extends org.apache.struts.action.ActionServlet,中进行设置。

如果不进行上面的设置,在tomcat的环境中,request.getParameter("AAA"),如果AAA是日文汉字的话,必然产生乱码。(tomcat默认的编码是IS0-8859-1)。

以上处理,紧紧是最简单的处理,据说可以通过web.xml的filter配置来进行管理的,如何配置web.xml,在文章最后提供了一个网友给出的答案。作用同我说的在自己封装的 ActionServlt extends org.apache.struts.action.ActionServlet,中进行设置的效果是差不多的。


第二部分:
关于url里面传递日文参数造成的乱码问题解决方案

(可能在url里传递的格式如果不指定的话和apserver默认的编码是一致的,也就是如果我用的是tomcat的话,那么我这里传递url,编码就是ISO-8859-1的)

(不知道websphere默认的是什么,没有调查过)

一般将所需要做的就是将URL进行URLEncoder ※

例子:     String param1= URLEncoder.encode( “陸楊”,"Windows-31J");
  
特别注意:  对于 encode过的字符集,一般来说是需要URLDecoder.decode(request.getParameter("param1"))解析之后才能使用的。
但是在struts中,直接在下一个画面中使用,request.getParameter("param1"); 得到的结果还是"陸楊",可能是servlet内部已经转换过了。

如果上面的解决方案不能解决你的问题,而且你有是使用tomcat作为Apserver的话,
可以尝试一下下面的方法解决。(这个方法不推荐使用,因为最好程序还是不要依赖于apserver的配置
           
方法如下:
在tomcat的server.xml中,加入URIEncoding="Windows-31J
  <!-- Define a non-SSL Coyote HTTP/1.1 Connector on the port specified during installation  -->
    <Connector   port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" URIEncoding="Windows-31J"/>

PS:在tomcat5系列中,通过get方式提交表单或者url方式传递日文参数,使用此法是可行的。post方式可以参照下面的过滤器的处理方式,或者我所说的自己重写ActionServlet的方式来解决。


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※public class URLEncoderextends Object HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。有关 HTML 格式编码的更多信息,请参阅 HTML 规范。

对 String 编码时,使用以下规则:

 

字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
特殊字符 "."、"-"、"*" 和 "_" 保持不变。
空格字符 " " 转换为一个加号 "+"。
所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。
例如,使用 UTF-8 编码机制,字符串 "The string ü@foo-bar" 将转换为 "The+string+%C3%BC%40foo-bar",因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。
 

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※完美解决方案。
做个过滤器。首先建立文件
filter.CharacterEncodingFilter.java

然后写入代码
package Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {

 public void destroy() {
 }
 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  request.setCharacterEncoding("Windows-31J");
  chain.doFilter(request, response);
 }

 public void init(FilterConfig conf) throws ServletException { 
 }

}
然后修改配置文件web.xml
   <filter>
   <filter-name>CharacterEncodingFilter</filter-name>
   <filter-class>Filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>Windows-31J</param-value>
    </init-param>
  </filter>
    <filter-mapping>
   <filter-name>CharacterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值