项目采用UTF8编码,数据库是既有数据库,字符集为ISO8859-1,将UTF8编码的中文转换成ISO8859-1存储到数据库中,数据库显示就是乱码,这个是为什么呢,我已经转成ISO8859-1了呢。但是如果项目使用GBK编码,那么用这样的方法数据库查询出来完成不存在乱码问题。这个又是为什么。我现在被编码弄的很恼火请教达人PS:1.数据库为ORACLE,西文字符集
2.项目使用JSP,编码是UTF8,UT8的中文直接转换编码为GBK也会乱码

解决方案 »

  1.   

    服务器的编码有设置么(比如tomcat service.xml里面设置编码)
      

  2.   

    1  写一个过滤器  
    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 EncodingFliter implements Filter{ public void destroy() {


    } public void doFilter(ServletRequest arg0, ServletResponse arg1,
    FilterChain arg2) throws IOException, ServletException {
    arg0.setCharacterEncoding("gbk");
    arg1.setCharacterEncoding("gbk");
    arg2.doFilter(arg0, arg1);

    } public void init(FilterConfig arg0) throws ServletException {


    }}2  在\WebRoot\WEB-INF\web.xml  中配置
      <filter>
       <filter-name>自定义</filter-name>
       <filter-class>过滤器的包名.类名</filter-class>
      </filter>
      <filter-mapping>
       <filter-name>自定义</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
      

  3.   

    去了解下字符集的概念,还有字符和字节的概念、区别先吧。记住一个关键,计算机只能存放 字节,字符不是实际存在的,字节的byte映射到 字符集 中的虚拟存在-->即字符。dbclient(jdbc/uiclient)  <--->   driver    <--->    db他们中传送的永远是字节码(该字节码是 字符 通过某个字符集 编码的 byte),他们之间都存在  对 byte[]的解码、字符的编码过程。去网上搜索点东西先看下。
      

  4.   

    中文用utf-8编码,服务器用iso8859-1,取出数据后在转成utf-8,页面仍能正常显示中文的,只是服务器中都是乱码,
      

  5.   

    中文用utf-8或GBK编码成字节后传输到数据库中保存,如果数据库用iso8859-1解码,则显示乱码,但是其中的信息并没有丢失,取数据时,数据库用iso8859-1重新编码成字节,传递到程序中,如果这时在用开始用的字符集utf-8或GBK解码,则原来的数据不变,仍然是中文。
      

  6.   

    如果是数据库的编码 ISO8859-1,你又想插入中文就必须乱码 
      

  7.   

    wypbt1032
    你的认识已经趋于客观了,但部分还不清晰。你考虑下向数据库塞数据时,为什么会存在一个jdbc规范?
    jdbc规范数据类型为什么需要和数据库数据类型存在映射关系?谁来解决这些映射关系?谁来将java对象转化为数据库的对象?jvm中的对象即内存中字符的表达方式是什么编码方式?jvm内码是否固定?jvm中字符串对象到数据库的vchar[]对象编码的处理过程由哪些来完成?这么提问题,希望你别生气。
      

  8.   

    对了! 最好还能去了解下 ISO8859-1 是什么  :》编码中存在超集问题,例如 GBK是gb2312的超级.
    例如 任何编码都会包含ascII码。
      

  9.   

    使用过滤器也好,AOP也好,将UTF8转换成ISO8859-1之后的数据存入数据库中,使用PL/SQL去查询依旧是乱码,但是如果是GBK转成ISO8859-1的话,那么使用PL/SQL去查询出来是中文,现在又要页面正确显示,又要数据库正确显示
      

  10.   

    public void doFilter(ServletRequest arg0, ServletResponse arg1,
    FilterChain arg2) throws IOException, ServletException {
    arg0.setCharacterEncoding("gbk");
    arg1.setCharacterEncoding("gbk");
    arg2.doFilter(arg0, arg1);}
    你看下这行吧 
    你应该也把存入数据的代码发来看看
      

  11.   

    过滤器就是单纯的转换字符编码,转换了字符编码之后存入数据库,依旧是乱码。
    你吧编码都改成了GBK,提交上来的是UTF8转GBK已经是乱码了,再存到数据库中更加不知道是什么东西了。。
      

  12.   

    中文到数据库存成ISO-8859-1当然看着是乱码了
      

  13.   

    to jackieban话说给想听的人,你觉得没用我也没有办法。
    搞清楚问题本质后,往往会发现直接告诉问题答案对方也有可能不理解,还不如告诉他解决问题思考的方法。wypbt1032 对字符集知识知道的比你要多,所以我提了点建议。至于你现在提供给楼主的方法,你不觉的方向有问题?你这样的设置只能针对 http context-type=gbk的情况,做编码的统一。跟楼主的问题不搭边。至少你不了解 jvm 内码知识点。请在不了解别人的话的时候不要觉得别人的话是废话。 即使了解了别人的话,也请别说,因为能体现你的素质。
      

  14.   

    既有的oracle数据库,不能随便更改。在做项目的时候也没有权限修改客户的数据库吧。
      

  15.   

    utf-8 不是已经包含了所有国家的字符了吗
      

  16.   

    西文字符集 对中文支持不了,如果我没记错好像是unicode的子集。如果数据库不改,server端转码没问题后,plsql通过设定,达到和server端一样的转码效果就能正确显示了。数据库编码的设定不设置为UTF-8的确有点奇怪,感觉这方面都快成为一个标准了。
    毕竟utf-8是unicode transform 形式,支持所有语言。而且http也多用utf-8进行统一。
      

  17.   

    贴一个我收藏的文章,希望对大家有用。http://www.javaeye.com/topic/398782
      

  18.   

    utf-8和gbk是可以使用中文的,而ISO-8859-1反而是不能够存中文的,你把数据库和页面都改成utf-8或者gbk就可以了,
      

  19.   

    经过moshalanye的指点和他的留言,我终于弄明白了,我存储的数据没有问题,因为使用的plsql developer的时候,对中文的显示采用的是GB2312,所以我使用UTF8转的数据在这里查看的时候都是乱码,非常感谢moshalanye,也推荐大家看看他提供的那个文章