zoukankan      html  css  js  c++  java
  • java中处理字符编码(网页与数据库)(转)

    首先声明一下,此文章时从网上转载的。如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat跑的时候得用他说的方法,不过到了WebSphere的时候必须得用原先的 
    String name = request.getParameter("name"); 
    所以采取本文方法的时候不要太死板,多试试。 

    在Java编程中,中文字体编码难倒了不少程序员,如果抓住了影响Java中文显示的几个关键因素,问题将迎刃而解。 
    Java是目前最流行的面向对象的编程语言之一,Java支持UTF-8、ISO-8859-1、GBK等各种字体编码,可是发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,特意总结如下。 

    影响Java中字体编码正确显示的有几个因素: 
    1)数据库的连接方式; 
    2)网页中使用的字体编码; 
    3)数据库里存放数据的字体编码; 
    4)Java的缺省字体编码。 
    如果在编程中遇到不能正确显示中文时,要先弄清楚以上几项所使用的字体编码,再分析找出原因,即可解决问题。 
    众所周知,JSP是Java的一种,和网页有关,而网页也有自己的中文编码系统,所以JSP处理中文要比纯Java的类文件更为麻烦。本文的测试数据库是MySQL3.2,数据库连接驱动是用org.gjt.mm.mysql.Driver,这里主要讨论UTF-8和GBK的显示( GB2312是GBK的一个子集,Java中可以使用GBK来代替GB系列)。我们先来研究JSP中字体编码问题, 下面第一到第六点是针对JSP的(因为从数据库里读出中文数据与写入中文数据有所区别,咱们分别说明,前三点是从读取数据库到显示在网页,后三点是从网页输入数据到存入数据库),第七到第九点针对纯Java的类文件。 以下rs表示ResultSet的一个实例,是执行Select语句之后产生的数据集。 

    一、数据库连接方式使用UTF-8 

    在连接数据库的驱动后面加上这句参数 
    useUnicode=true&characterEncoding=UTF-8 
    例如: 
    jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 

    从数据库里读出中文显示在使用GBK的JSP的网页里,如果数据库里存放的字体编码是UTF-8,在JSP中使用 
    str=new String(rs.getBytes(1),"UTF-8"); 
    或者 
    str=rs.getString(1); 
    可以正确显示中文。 

    如果数据库里存放的是GBK数据,那么JSP中也要使用 
    str=new String(rs.getBytes(1),"GBK"); 
    来显示正确的中文。 
    值得注意的是如果页面使用UTF-8,数据库里存放的是UTF-8,也可以用 
    str=new String(rs.getBytes(1),"GBK"); 
    正确显示中文。 

    如果网页是UTF-8,而数据库里存放的是GBK,无法直接显示中文,需要2步转换, 
    str=new String(rs.getBytes(1),"GBK"); 
    再 
    str=new String(str.getBytes("UTF-8"),"GBK"); 
    才可以正确显示中文。 


    二、数据库连接方式使用GBK 

    在连接数据库的驱动后面加上这句参数 
    useUnicode=true&characterEncoding=GBK 
    例如: 
    jdbc:mysql://localhost/DBVF?autoReconnect=true&UseUnicode=true&characterEncoding=GBK 
    从数据库里读出中文,显示在使用GBK的JSP的网页里. 

    如果数据库里存放的字体编码是UTF-8,在JSP中一定要使用 
    str=new String(rs.getBytes(1),"UTF-8"); 
    才正确显示中文。 

    如果数据库里存放的是GBK数据,那么JSP中也要使用 
    str=new String(rs.getBytes(1),"GBK"); 
    或者直接使用 
    str=rs.getString(1); 
    即可显示正确的中文。 

    如果网页是UTF-8,而数据库里存放的是GBK,只能用 
    str=new String(rs.getString(1).getBytes("UTF-8"),"GBK"); 
    的方法来显示中文. 

    如果网页是UTF-8,而数据库里存放的是UTF-8,可用 
    str=new String(rs.getBytes(1),"GBK"); 
    或者 
    rs.getString(1)方法来显示中文。 


    三、使用缺省数据库连接方式 

    连接数据库的驱动后面没有这句参数 
    useUnicode=&characterEncoding= 
    例如: 
    jdbc:mysql://localhost/DBName?autoReconnect=true 
    没有参数 
    useUnicode=true&characterEncoding,表示使用默认的ISO-8895-1编码。 

    1. 从数据库里读出中文,显示在GBK的网页里。 
    如果数据库里存放的字体编码是UTF-8,在JSP网页中一定要使用语句 
    str=new String(rs.getBytes(1),"UTF-8"); 
    或者 
    str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8"); 
    才可正确显示中文。 

    如果数据库里存放的是GBK数据,那么JSP中也要使用 
    str=new String(rs.getBytes(1),"GBK"); 
    或 
    str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK"); 
    显示正确的中文。 

    2. 如果网页是UTF-8,不能直接正确显示GBK,需要2步转换 
    str=new String(rs.getBytes(1),"GBK"); 
    再 
    str=new String(str.getBytes("UTF-8"),"GBK"); 
    才可以正确显示中文。 

    如果数据库里存的是UTF-8,直接用 
    str=new String(rs.getBytes(1),"GBK"); 
    或者 
    str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK"); 
    就可以显示中文了。 

    以上是读取数据库里中文正确显示在网页上,下面三点是如何正确存入数据库。 


    四、数据库连接方式使用UTF-8编码 

    JSP中要把网页输入的中文存入数据库,通常有一个提交(Submit)的过程,是用 
    str = request.getParameter("username"); 
    然后执行update或者insert语句来存入数据库。如何赋值给str很重要,而且这里中文输入与网页所使用的字体编码有关。 

    1、 网页使用UTF-8,使用 
    str = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); 
    或者 
    str = new String(request.getParameter("username").getBytes(),"UTF-8"); 
    都可以使得存到数据库里的数据是UTF-8编码。 

    2. 网页使用GBK,使用 
    str = new String(request.getParameter("username").getBytes(),"GBK"); 
    那么存入数据库的是UTF-8编码。 

    3. 值得注意的是使用UTF-8的数据库连接方式不能存得GBK。 


    五、数据库连接方式使用GBK编码 

    1. 输入使用GBK网页,存到数据库里是GBK的方法: 
    str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK"); 
    或者 
    str= new String(request.getParameter("username").getBytes(),"GBK"); 

    2. 网页使用GBK,想存入UTF-8到数据库里,要分2步: 
    str=new String(request.getParameter("username").getBytes(),"GBK"); 
    再 
    str=new String(str.getBytes("UTF-8"),"GBK"); 

    3. 网页使用UTF-8,而且使用 
    str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK"); 
    或者 
    str= new String(request.getParameter("username").getBytes(),"UTF-8"); 
    那么存到数据库里的数据是UTF-8编码。 

    4. 网页使用UTF-8,而且使用 
    str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); 
    那么存到数据库里的数据是GBK编码。 


    六、数据库连接方式使用缺省,即不使用参数useUnicode和characterEncoding 

    1. 网页使用GBK,如果使用 
    str= request.getParameter("username"); 
    或者 
    str= new String(request.getParameter("username").getBytes()); 
    那么在数据库里的数据是GBK码。网页使用UTF-8和使用 
    str= request.getParameter("username"); 
    则存入数据库是UTF-8编码。 

    2. 如果使用 
    str= new String(request.getParameter("username").getBytes("ISO-8859-1")); 
    那么根据网页提供的字体编码而存到数据库里,比如是UTF-8的网页,那么存到数据库中就是UTF-8编码,如果使用GBK网页,那么存到数据库里的字就是GBK编码。 

    3. 如果使用 
    str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8"); 
    这一种组合能存到正确的数据外,其他存到数据库里的数据则都是乱码或者错误码。在这个UTF-8组合的特例中,网页使用的是GBK,则存放到数据库里就是GBK,网页使用UTF-8,那么存到数据库里的就是UTF-8。 

    4. 网页是GBK的要存得UTF-8,一定需要2步: 
    company=new String(request.getParameter("company").getBytes(),"GBK"); 
    和 
    company=new String(company.getBytes("UTF-8"))。 

    5. 网页是UTF-8的,不能存得GBK在数据库里,一句话,改变数据库连接方式不能存得GBK码。 

    以上所有的都是基于JSP网页和数据库交换数据,下面讨论一下纯JAVA编程下的字体编码转换。 


    七、数据库连接方式使用UTF-8编码 

    1. 数据库里的中文是UTF-8,可以转换为GBK,但不能把GBK存入数据库。 

    2. 数据库是GBK,如果转换为UTF-8,使用 
    content=new String(rs.getBytes(2),"GBK"); 
    直接将content存入数据库就可为UTF-8。 


    八、数据库连接方式使用GBK编码 

    1. 数据库里的中文是UTF-8,如果转换为GBK,使用 
    content= new String(rs.getString(2).getBytes(),"UTF-8"); 
    再直接使用update或者insert语句插入到数据库,即存得GBK。 

    如果使用 
    content= new String(rs.getString(2).getBytes(),"GBK"); 
    或者 
    content= new String(rs.getString(2).getBytes()); 
    再存入数据库即存得还是UTF-8编码。 

    2. 数据库里的中文是GBK,如果转换为UTF-8,使用 
    content= new String(rs.getString(2).getBytes("UTF-8")); 
    或者 
    content= new String(rs.getString(2).getBytes("UTF-8"),"GBK"); 
    再直接使用update或者insert语句插入到数据库,即存得UTF-8。 

    3. 如果某个String是GBK,要转换为UTF-8,也是使用 
    content= new String(GBKstr.getBytes("UTF-8")); 
    或者 
    content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 

    如果某个String是UTF-8,要转换为GBK,应该使用new String(UTFstr.getBytes("GBK"),"UTF-8")。 


    九、数据库连接方式使用缺省,即不跟参数 

    1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1"); 
    可以将数据库里的GBK编码转换为UTF-8。 

    2. 读取UTF-8然后存入UTF-8,则用 
    str1=new String(UTFstr.getBytes(),"ISO-8859-1"); 
    或者 
    str1=new String(UTFstr.getBytes("GBK"),"ISO-8859-1"); 

    3. 不能实现数据库里的UTF-8转换为GBK。 
    如果采用UTF-8的数据库连接方式或者缺省数据连接方式,那么无法将UTF-8转为GBK;而GBK的数据库连接方式可以实现UTF-8和GBK的相互转换。建议大家采用GBK的数据连接方式。

    http://lasombra.iteye.com/blog/993069

  • 相关阅读:
    [COCI20142015#1] Kamp
    [CEOI2007]树的匹配Treasury
    [JLOI2016/SHOI2016]侦察守卫
    [POI2015]MOD
    [BJOI2017]机动训练
    [九省联考2018]一双木棋chess
    [清华集训2012]串珠子
    [POI2014]ZALFreight
    [SHOI2009]舞会
    [COCI2019]Mobitel
  • 原文地址:https://www.cnblogs.com/softidea/p/5299852.html
Copyright © 2011-2022 走看看