就象标题中写得那样,
使用struts编写java网站应用程序,
如果在jsp的form中输入类似"堃"(kun),"喆"(zhe)等全拼下还是打得出来的汉字,
在jsp中提交表单的js里alert可以看到form的表单元素里的value还是正常的,没有出现乱码,
但是进入Action后,从ActionForm中获得该汉字所在属性的值,
就会发现相关汉字变成了"?"或者"□"之类的符号了.jsp上已经使用了
<%@ page contentType="text/html; charset=GBK"%>
<html:html locale="true">
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />web.xml和struts-config.xml中都是<?xml version="1.0" encoding="GBK" ?>开头的并且在web.xml有如下配置:
<filter>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <filter-class>com.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>GBK</param-value>
    </init-param>
  </filter>
 <filter-mapping>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>而com.filters.SetCharacterEncodingFilter的doFilter方法中有如下代码:
 request.setCharacterEncoding("GBK");
 // 传递控制到下一个过滤器
 chain.doFilter(request, response);对绝大多数的汉字都没有问题的,
就是碰到个别几个类似"堃","喆"等就会变成乱码,
我也不知道这些是不是属于冷僻字的范围,
听同事说,全拼打得出来的汉字说明GBK字符集里是有的,
用各种各样的编码集,包括ISO-8859-1,UTF-8等都互相转换过了
全都没有用,越转越乱,
如果页面使用别的字符编码集则页面上显示的全部的汉字都会变成乱码,
求教哪位大虾能够给在下在茫茫迷雾之中亮盏明灯,指一条正确的道路呢?
在下万分叩谢了先~

解决方案 »

  1.   

    我用的方式和你不一样~~~我给你看我写的方式吧-------------------------servlet--------------------------------------/*
     * no comments
     */
    package com.water.util;
    import java.util.Iterator;
    import java.util.Map;import javax.servlet.http.*;
    import org.apache.struts.action.ActionServlet;public class SetCharacterEncodingFilter extends ActionServlet {
    protected void process(HttpServletRequest request,
    HttpServletResponse response) throws java.io.IOException,
    javax.servlet.ServletException {
    request.setCharacterEncoding("UTF-8");// 字符集内码转换

    if(request.getMethod().equalsIgnoreCase("get")) {
    Map paramMap = request.getParameterMap();
    Iterator iterator = paramMap.values().iterator();
    while(iterator.hasNext()) {
    String[] param = (String[])iterator.next();
    param[0] = new String(param[0].getBytes("ISO-8859-1"),"UTF-8");
    }
    }
    super.process(request, response);// ActionServlet 的处理
    }
    }
    ------------------------------------------web.xml-------------------------------------- 
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>
    com.water.util.SetCharacterEncodingFilter
    </servlet-class>----------------------------------jsp页面------------------------------------
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>然后就可以了,其他地方都不需要设置什么。只要jsp页面最头上写 pageEncoding="UTF-8"%>
      

  2.   

    我用的方式和你不一样~~~我给你看我写的方式吧-------------------------servlet--------------------------------------/*
     * no comments
     */
    package com.water.util;
    import java.util.Iterator;
    import java.util.Map;import javax.servlet.http.*;
    import org.apache.struts.action.ActionServlet;public class SetCharacterEncodingFilter extends ActionServlet {
    protected void process(HttpServletRequest request,
    HttpServletResponse response) throws java.io.IOException,
    javax.servlet.ServletException {
    request.setCharacterEncoding("UTF-8");// 字符集内码转换

    if(request.getMethod().equalsIgnoreCase("get")) {
    Map paramMap = request.getParameterMap();
    Iterator iterator = paramMap.values().iterator();
    while(iterator.hasNext()) {
    String[] param = (String[])iterator.next();
    param[0] = new String(param[0].getBytes("ISO-8859-1"),"UTF-8");
    }
    }
    super.process(request, response);// ActionServlet 的处理
    }
    }
    ------------------------------------------web.xml-------------------------------------- 
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>
    com.water.util.SetCharacterEncodingFilter
    </servlet-class>----------------------------------jsp页面------------------------------------
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>然后就可以了,其他地方都不需要设置什么。只要jsp页面最头上写 pageEncoding="UTF-8"%>
      

  3.   

    提问方还有一点需要补充一下,
    就是反方向的操作:
    即在action中调用web service接口获得其他数据库中带有"堃","喆"等字的资料后,
    insert到本系统数据库中去,数据库中不会出现乱码,
    再从本系统数据库中select出来,装入actionForm,
    forward到jsp上用bean:write显示出来的话也不会有乱码问题.
      

  4.   

    哦,handanyiying,
    那你用了你写的这套代码,碰到"堃","喆"等字的时候就不会发生乱码了咯?
    我们现在的应用程序已经在生产环境上使用了,
    这样改的话可能影响蛮大的,
    等于编码要全部改成UTF-8了,
    之前我有把jsp的charset变成UTF-8,结果整个页面上全是"□"等乱码,
    而且如果jsp和java的编码改了,是不是数据库的编码也要跟着变呢?
    不然的话,这边是改好了,
    从数据库读写数据又不行了.
      

  5.   

    不过还是很感谢你的,handanyiying, 
    我刚发帖你就回了,
    我还以为根本没人会理我呢,
    感动ing...BTW:
    能有人告诉我怎么样以比较小的修改幅度取得解决问题的效果吗?
    并且GBK中真的没有"堃","喆"等字吗?
    为什么我在网上查资料只说Big5中没有这两个字呢...
      

  6.   

    修改class SetCharacterEncodingFilter  让它处理那几个字符 不知道是否可行? 如果乱码字较多的话 就别考虑这个方法了。“再从本系统数据库中select出来,装入actionForm, 
    forward到jsp上用bean:write显示出来的话也不会有乱码问题.”你前台和后台的编码是不是都保持一致了啊?