问题描述:
一套jsp应用程序,后台使用oracle,字符集是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,一切正常。后来客户更改了数据库的字符集(客户总是对的,不要指望改回来),为AMERICA_AMERICA.US7ASCII,结果jsp页面上所有从数据库读取的中文字符全部成了乱码(非数据库字符显示正常)。
尽管可以通过string.getBytes("iso-8859-1")转换字符串来消除乱码,可是现在jsp页面数量巨大,除了显示的时候要转换为汉字编码,在保存的时候还要转换为ISO88591的编码,所以这个方法不大可行。问题:
能不能通过Filter来统一处理编码转换(我自己用过滤器request.setCharacterEncoding("GBK")只能处理页面间传送的字符乱码问题,对数据库读取的无能为力)?或者在连接的时候有什么参数可以直接读取并转换?或者其他方法可以批量转换?越简单越好

解决方案 »

  1.   

    数据库中读取数据时统一转码 /**
     * GB to Unicode
     * @param strIn
     * @return String
     */
    public static String GBtoISO(String strIn)
    {
    byte[] b;
    String strOut = null;
    if (strIn == null || (strIn.trim()).equals("")) { return strIn; }
    try
    {
    b = strIn.getBytes("GBK");
    strOut = new String(b, "ISO8859_1");
    }
    catch (UnsupportedEncodingException e)
    {
    }
    return strOut;
    }
    public static String myEncoding(String strIn){
        //tomcat5
        return GBtoISO(strIn);
        //websphere4
        //return strIn;
    }
      

  2.   

    public class COPActionServlet extends ActionServlet { protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
    try

    request.setCharacterEncoding("GB2312");
    System.out.println("COPActionServlet+GB2312");
    } catch(Exception e)
    {
    e.printStackTrace();
    System.out.println("error in setCharacterEncoding! COPActionServlet+GB2312");
    }
    super.process(request, response);
    }
    }进出都搞搞上面的飞机!
      

  3.   

    楼主可以想想看,封装一个PrepareStatement。然后重载部分接口,比如起一个叫OracleEncordingPreparedStatement类,然后重载其setString()和getString(),在这里统一的处理编码问题。
       最后在这个项目内部统一使用这个OracleEncordingPreparedStatement来操作SQL文,估计也算是一种办法了吧。
      

  4.   

    oracle自身有一个函数,可做字符集的编码转换,用在Select文中。我忘了,你自己到oracle版问问。
      

  5.   

    可以做一个Servlet对所有的request,responce做统一的代码转换.
      

  6.   

    无非有两种解决方案。
     一是在执行sql前把GBK的转为ISO88591的,并在执行后把rs里面取的东西转回来。
    二是自己封装两个类,一个是数据库操作的,里面执行sql的时候都自动把sql转码,一个是封装resulset的,里面的东西都自动做转码。两种方案都要挨个替换数据库操作部分的代码。没有更好的办法了。不过最好还是养成自己代码里面转码的习惯。这样,换数据库都没有问题。其实,你遍历一边代码,这样改的话,也花不了多少时间的,最多几个小时也就搞定了,而且以后都不用再改了。
      

  7.   

    谢谢以上各位!
    我现在的做法是写一个转换的方法change(),并调用该方法把rs取出来的字段进行转换,查询结果可以相识中文
    但我在页面做记录插入的时候,插入的数据在数据库显示还是乱码.我试着在插入数据前,把数据做一次转换(还是调用change()方法),数据入库后还是乱码,请问怎么解决呢?无论问题有没解决,到最后我都每位热心的朋友结分!谢谢各位
      

  8.   

    插入数据时,做的转码是反方向的,应该是 
    sql = new String(sql.getBytes("GBK"),"ISO-8859-1");
    所以,如果你调的change()是用来把查询结果转成中文,那么,插入前还调这个是肯定不行的。