sqlITE
中文编码转换的问题终于
解决了。 从
数据库取的时候直接用rs.getBytes("username")取得byte[],而不是用rs.getString("username")取STRING。 通过取得的BYTE来转即可以得到正常的
中文,否则怎么转都是乱码。 byte[] val = rs.getBytes(cols_name); data.put(cols_name,new String(val,"GBK")); java 编码 UTF-8、ISO-8859-1、GBK 关键字: java utf-8、iso-8859-1、gbk java 编码 UTF-8、ISO-8859-1、GBK 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/DBVF?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")即可。 3. 网页使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"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的数据连接方式。
原文链接:https://www.f2er.com/sqlite/201061.html