本帖最后由 bgsbati1987 于 2010-11-05 10:47:31 编辑

解决方案 »

  1.   

    你先debug 看下插入数据库前 是否已经乱码
    还有你的数据库的语言格式是没问题的  oracle字符默认是UTF-8吧
      

  2.   

    所有要设置 编码的地方 你都改成 utf-8 应该就没什么问题
      

  3.   

    jsp页面、tomcat的server.xml,甚至包括struts里的struts-config.xml和web.xml我都改成utf-8了,结果还是一样的
      

  4.   

    建议可以在你的Action中写个方法 String trans(String str)
    {
    String result=null;
    byte temp[];
    try
    {
    temp=str.getBytes("iso-8859-1");
    result=new String(temp);
    }
    catch(UnsupportedEncodingException e)
    {
    System.out.print(e.toString());
    }
    return result;
    }
      

  5.   

    传到动态ActionForm中的已经是乱码了,这是咋回事?
      

  6.   

    所有要设置 编码的地方 你都改成 utf-8 应该就没什么问题
      

  7.   

    插入之前就是乱码,而且从表单传到动态ActionForm中就已经变成乱码了,这是怎么回事?
      

  8.   

    请问这段代码的用途是什么?我在Action里调用了一下,直接用中文作参数和把从动态ActionForm中传递的变量(其实已经是乱码)做参数,都打印出乱码。不同的直接用中文做参数,输出“??”;用变量(同样的中文)作参数,输出“涓枃”这种东西。
      

  9.   

    插入之前就是乱码那得检查你当前的页面是不是编码方式为UTF-8?如果是的话那就看看你有没有过滤器,过滤器配置的是什么编码?
      

  10.   

    想debug看看,是插入前乱码还是插入后乱码一部分一部分排查
      

  11.   

    传到ActionForm中已经是乱码?那试着在struts.properties中加上这两个:
    struts.locale=zh_CN 
    struts.i18n.encoding=UTF-8 
      

  12.   

    如果是struts的话,可以在struts-config.xml中加入一个拦截器,具体怎么搞的忘了(本人struts用的少)不过看楼主的意思,是用jsp直接存进数据库的,这个本人不清楚本人也是新手
      

  13.   

    从页面提交到后台 一般是JSP页面和工程统一编码
    然后就看你是怎么传值的 是get 还是 post
    你在Action 转码试试
      

  14.   

    把myeclipse的默认编码类型改成UTF-8,
    在常规的工作空间那改。 具体流程:
    窗口->首选项->常规->工作空间
      

  15.   

    若数据库配好了,传到action中没有乱码,那一般都不会有乱码
    先看看在action中是否有乱码
      

  16.   

      在action 中解码 把传过来的数据 转成utf-8 试试 是否可行。。
      

  17.   

    request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
      

  18.   

    这是因为你接到的参数本身就是乱码,你把你的参数用new String(signature.getBytes("ISO-8859-1"),"gbk");就个设置一遍,在插入数据库,就可以了!
      

  19.   

    的确是直接用jsp存的,没经过过滤器
      

  20.   

    楼主啊,你把在URL中的中文编码改成jbk就可以了 ,因为你java类的编码是GBK的
      

  21.   

    最开始改的就是gbk,也不行的
      

  22.   

    基本上是崩溃了,看了一天多jsp编码的东西,各种版本,基本上还是不明白。刚加了个过滤器,tomcat都起不来了,报错:“严重: Parse error in application web.xml file at jndi:/localhost/title/WEB-INF/web.xml
    java.lang.IllegalArgumentException: Can't convert argument: null”。
      

  23.   

    不需要过滤器 ,
    struts本身就有全局拦截的功能,新建一个类,继承ActionServlet ,在这里把编码设置一下就OK.
    package com.shangdu.struts;import java.io.IOException;
    import java.io.UnsupportedEncodingException;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionServlet;public class BaseActionServlet extends ActionServlet {

    public void proress(HttpServletRequest request,HttpServletResponse response){
    try {
    request.setCharacterEncoding("gb2312");
    response.setCharacterEncoding("gb2312");
    super.process(request, response);
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ServletException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }在WEB.XML里 把全局拦截器给换掉就OK了
    原来的是这样<servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>改完是这样
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>com.shangdu.struts.BaseActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      

  24.   

    web.xml中设置字符过滤器,字符集合设成utf-8的,页面编码也是utf-8的。
      

  25.   

    同志写个中文转换的类
    public class zw
    {
    public zw()
    {

    }
    public static String zwzh(String str)
    {

    if(str == null)
       {
        return null;
           }
     try{     
     str = new String (str.getBytes("iso-8859-1"));      
       }
    catch(Exception e)
    {
    System.out.println("!!!!!!!!!"+e);
    }   
    return str;
    }
    public static void main(String[] age)
    {
    String kk="成功";
    System.out.println("!!!!"+kk);
    }
    }
      

  26.   

    你说的是
    <?xml version="1.0" encoding="UTF-8"?>
    还有<init-param>
       <init-param>
       <init-name>encoding</init-name>
       <init-value>UTF-8</init-value>
       </init-param>这两个地方吗?
      

  27.   

    这个是可以的。普通的Java程序和jsp不太一样,普通的Java程序的用的是操作系统里的字符集,好像咱么这是gbk,不用我们操心。但是jsp好像就要各种设置了。
      

  28.   

    楼上我这个方法同样是可以用在JSP程序里头的
      

  29.   

    应该不是Ajax的事,我把默认页面直接配到了输入的那个页面,还是乱码。
      

  30.   

    这个是struts2中的东西吧,我用的1
      

  31.   

    to : bgsbati1987你还是去看看字符集的基础知识,知道了解下数据库到jvm中,字符到底编码几次。还有java文件中的中文,经过哪些过程进入jvm.再个就是浏览器和猫之前表单的参数,在两者之间传递时到底经过哪些编码过程。
    如果这些你都明白了,你也不用看楼上那些具体的解决方案了,你就可以自己进行分析了。
      

  32.   

    nicholasbobo 指的问题在javaeye的ahuaxuan的blog中有一篇文章专门讲了,讲的非常详细,楼主可以看看。这个参数我没记错的话,是对模板有用,对jsp正常的response没用,还是走的context-type charset的老路。
      

  33.   

     oracle字符默认是UTF-8吧
    对安装好的oracle改变字符集设置看行不行?可以在oracle用户的.profile文件中指定,例如
    ...
    ORACLE_HOME=$ORACLE_BASE/product/8.1.6
    NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
    ...也可以在手工创建数据库的时候指定,注意安装的时候不能选择典型安装,这个时候没有选项让你选择字符集,如果你没有在.profile文件中指定NLS_LANG,字符集就只能是系统默认的了,不过默认的好像就是US7ASCII .
      

  34.   

    1.表单是否是post提交
    2.在struts中request.setCharacter()或者response.setCharacter()基本上没用
    3.如果你的项目没用spring,那么建议自己创建一个过滤器,实现Filter借口就ok了
    4.在web.xml配置下就行了
       
      

  35.   

    表单是post提交的;项目中的确没有spring,正在看过滤器。
      

  36.   

    在插入到数据库之前已经是乱码了,正在解决这方面的问题。数据库应该是没有问题的,Oracle服务端的配置和本机客户端的配置都是SIMPLIFIED CHINESE_CHINA.ZHS16GBK的。
      

  37.   

    有这么多人帮你解决问题,相比解决了吧good luck
      

  38.   

    你直接再action把请求参数进行转码嘛!转成与你对应数据库编码格式就行了嘛!都晓得问题出再那里,就针对这个问题去找解决办法嘛!乱码问题再web开发经常会出现,但是只要懂这个原理就很容易解决嘛!!
      

  39.   

    折腾了好几天,最后用的过滤器解决的。之前在web.xml中配置过滤器的时候,出现的“严重: Parse error in application web.xml file at jndi:/localhost/title/WEB-INF/web.xml
    java.lang.IllegalArgumentException: Can't convert argument: null”可能是由于配置文件中有非法字符引起的,因为之前的是复制过来的,早上删去自己输了一遍,然后就可以了。我把myeclipse的默认编码类型改成UTF-8,如20楼所说。这是我web.xml中对过滤器的配置
      <filter>
       <filter-name>setEncoding</filter-name>
       <filter-class>yourPackage.FilterEncoding</filter-class>
       <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
       </init-param>
      </filter>
      
      <filter-mapping>
       <filter-name>setEncoding</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
    这是我的过滤器类
    package yourPackage;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;
    import javax.servlet.http.HttpServlet;public class FilterEncoding implements Filter {

        private String encoding = null;
        private FilterConfig filterConfig = null;
        
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
            this.encoding = filterConfig.getInitParameter("encoding");
        }    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain)throws IOException, ServletException {
            String encoding = this.encoding;
                if (encoding != null) {
                    request.setCharacterEncoding(encoding);
                }
            chain.doFilter(request, response);
        }    public void destroy() {
            this.encoding = null;
            this.filterConfig = null;
        }
    }
    给同样想使用过滤器的朋友做个参考,其实都从网上淘来的。不过使用的时候,最好不要ctrl-c v,尤其是
    web.xml,可能会出现非法字符问题,自己输一遍。回复的朋友们提供了很多建议,像直接转码、中文转换类、直接使用request.setCharacterEncoding和 response.setCharacterEncoding等等,有的是用了没效果,有的是觉得改起来麻烦不便于统一管理,所以最终用了过滤器,而且以后项目中应该还会用到过滤器。尽管问题是解决了,但是原理不是很清楚,因为我觉得很多解决方法和过滤器的思路都差不多,但是却没有效果,也可能是strut的原因。等以后搞明白了,再和大家分享吧。
      

  40.   

    找乱码的确要先debug,看看乱码出在哪,然后才能进一步解决。这两天老在怄气,老毛病了,再加上学校这一分钟在线,五分钟掉线的网络,就更堵得慌了。就这条回复还要试着在在线的那一分钟才能发,呵呵。回复的朋友比较多,分也没多少。虽说在csdn的朋友很热心,不在乎分,但老觉得有点过意不去。我还发了一篇帖子(http://topic.csdn.net/u/20101108/12/17e430be-d554-422c-ae8a-ac0105034396.html),回复的人比较少(可能我的表述不是太清楚),大家没事的话过去看看,灌灌水,也当散分了。