对于Java语言来说,在其内部使用的是UCS2编码(2个字节的Unicode编码)。这种编码并不属于某个语系的语言编码,它实际上是一种编码格式的世界语。在这个世界上所有可以在计算机中使用的语言都有对应的UCS2编码。
实现上,当我们从IDE输入“中国”时,用的是java源代码文件保存的格式,一般是GBK,有时也可是utf-8,而在Java编译程序时,会不由分说地将所有的编码格式转换成utf-8编码。
Java中的属性文件只支持iso-8859-1编码格式,因此,要想在属性文件中保存中文,就必须使用UCS2编码格式("uxxxx),因此,出现了很多将这种编码转换成可视编码和工具,如Eclipse中的一些属性文件编辑插件。
大家碰到最多的编码问题就是在Web应用中.客户端提交数据时是根据浏览器当前的编码格式来提交的,如浏览器当前为gbk编码,就以gbk编码格式来提交。 这本身是不会出现乱码的,问题就出在Web服务器接收数据的时候,HttpServletRequest在将客户端传来的数据转成ucs2码上出了问题。在默认情况下,是按着iso-8859-1编码格式来转的,而这种编码格式并不支持中文,所以也就无法正常显示中文了,解决这个问题的方法是用和客户端浏览器当前编码格式一致的编码来转换,如果是utf-8,则在doPost方法中应该用以下的语句来处理:
request.setCharacterEncoding("utf-8");
影响Java中字体编码正确显示的有几个因素:1)数据库的链接方式;2)网页中使用的字体编码;3)数据库里存放数据的字体编码;4)Java的缺省字体编码 .
数据库链接方式使用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)方法来显示中文。
三、使用缺省数据库连接方式
连接数据库的驱动后面没有蛰居参数useUnicoding=&characterEncoding=,例如jdbc:mysql://localhost/DBVF?autoReconnect=true,没有参数useUnicoding=&characterEncoding,标识使用默认的ISO-8859-1编码。
1、 从数据库里读出中文,显示在GBK的网页里。如果数据库里存放的字体编码是UTF-8,在JSP网页中一定要使用语句str=new String(rs.getString(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中要把网页输入的中文存入数据库,通畅有一个提交的过程,是用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”),都可以是的存到数据库中的数据是UTF08编码。
2、 Ww网页使用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-8850-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(),”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得数据库连接方式