java+sql 编码 UTF-8、ISO-8859-1、GBK
摘录自:http://www.cnblogs.com/yezhenhan/archive/2011/01/14/1935376.html
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"),再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的数据连接方式。
参考链接:
深入剖析Java编程中的中文问题及建议最优解决方法
http://fafeng.blogbus.com/logs/3062998.html (1)
http://fafeng.blogbus.com/logs/3063006.html (2)
java+sql 编码 UTF-8、ISO-8859-1、GBK的更多相关文章
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- java字符编码详解
引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...
- JAVA字符编码二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换 1.函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有 ...
- 刨根究底字符编码之四——EASCII及ISO 8859字符编码方案
EASCII及ISO 8859字符编码方案 1. 计算机出现之后,从美国发展到欧洲,由于欧洲很多国家中所用到的字符中,除了基本的美国也用的那128个ASCII字符之外,还有很多衍生的拉丁字母等字符 ...
- java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 异常处理,及MySQL数据库编码设置
java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,C ...
- JAVA字符编码一:Unicode,GBK,GB2312,UTF-8概念基础
第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 来源:holen'blog 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16, ...
- Java所有编码问题参考手册
一.编码基本知识 1.iso8859-1 ——属于单字节编码,最多能表示的字符范围是 0-255,应用于英文系列.比如,字母 'a' 的编码为0x61=97. 很明显,iso8859-1 编码表示的 ...
随机推荐
- 由浅入深理解Java线程池及线程池的如何使用
前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...
- class java.awt.HeadlessException : No X11 DISPLAY variable was set, but this program performed an operation which requires it.
今天上午打印回单功能发布到测试环境,报了: class java.awt.HeadlessException : No X11 DISPLAY variable was set, but this p ...
- px-rem自适应转换
当前团队开发过程,存在2种度量单位(px.rem)各有说辞px:各个终端统一大小,简单明了,未尝不可!rem:大屏幕显示大字体,小屏幕显示小字体,渐进增强视觉感.业界各种写法都有,不逐一讨论.团队呼声 ...
- [Spark内核] 第37课:Task执行内幕与结果处理解密
本课主题 Task执行内幕与结果处理解密 引言 这一章我们主要关心的是 Task 是怎样被计算的以及结果是怎么被处理的 了解 Task 是怎样被计算的以及结果是怎么被处理的 Task 执行原理流程图 ...
- Loadrunner11.0调用Jar包
又好几天不写东西了,是不是意味着最近没有大的进步,时时敲打自己. 今天把loadrunner如何调用Jar包搞定了,现在把配置的过程中需要注意的东西写下来,分享给小伙伴儿,减少他们在前行路上的弯路. ...
- 【Tarjan】洛谷P3379 Tarjan求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- oracle之 RA-00054: resource busy and acquire with NOWAIT specified or timeout expired
1. truncate 表报 ORA-00054 ,标明有事务正在操作该表SQL> truncate table alldm.DM_XQKD_YUJING_D;truncate table al ...
- contain_of宏定义
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. 实现方式: co ...
- Memcache缓存
memcache 是服务器缓存系统,以键值对方式保存数据到内存中,把对象序列化后,理论上可支持所有的数据类型.使用情景:怎么用都可以,注意的是它只把数据保存到内存中,重启memcache 服务后丢失, ...
- Oracle触发bug(cursor: mutex S),造成数据库服务器CPU接近100%
问题现象: 项目反馈系统反应非常缓慢,数据库服务器CPU接近100%! INSERT INTO GSPAudit1712(ID,TypeID,CategoryID,DateTime,UserID,Us ...