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 sql编码_java+sql 编码 UTF-8、ISO-8859-1、GBK相关推荐

  1. java字符集编码_Java字符集编码

    1.概述 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587& ...

  2. linux java字符集编码_Java字符集编码

    1.  概述 在 下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 65 ...

  3. java菱形乱码 编码_JAVA:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  4. java http编码_java httprequest编码/解码

    http://jiapumin.iteye.com/blog/1006144 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回 ...

  5. java %u解码_Java:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  6. ansi编码_Java 字符编码

    点击上方蓝字关注我们! 作者介绍 王云静,Java 开发工程师,2018 年 7 月加入去哪儿网,目前在目的地 - 呼叫中心.曾获得过 ACM 亚洲区域赛铜牌. ----- 基本概念 字符集 字符(C ...

  7. java 关闭语句_java.sql.SQLRecoverableException: 关闭的语句

    数据库连接池配置: 数据库链接在运行时报错: Caused by: java.sql.SQLRecoverableException: 关闭的语句 at oracle.jdbc.driver.Orac ...

  8. java sql异常_java.sql.SQLException: Io 异常: Got minus one from a

    java.sql.SQLException: Io 异常: Got minus one from a read call at oracle.jdbc.driver.DatabaseError.thr ...

  9. java sql2005驱动_java.sql.SQLException:找不到适用于jdbc:microsoft:sqlserver的驱动程序...

    当我尝试运行此程序时,出现此异常.这是微软的例子之一.我已经通过项目属性将sqljdbc4.jar添加到了netbeans的类路径中,以便进行编译和运行.我还测试了可以使用下面的import语句找到该 ...

最新文章

  1. Python 学习笔记: 反射
  2. Redis中哈希hash数据类型(增加修改(设置单一属性、设置多个属性)、获取(获取键所有属性、获取单一属性值、获取多个属性值)、删除、使用hash可能出现的问题)
  3. linux 如何查看tomcat实时的日志
  4. 重磅,武汉大学获捐10亿元!
  5. 2017 Q3 ,互联网人的薪资发生了哪些变化?
  6. Vscode Python输出窗口中文乱码的解决办法
  7. python的字符串定界符可以使用_使用Template格式化Python字符串的方法
  8. react jest测试_如何使用Jest和react-testing-library测试Socket.io-client应用程序
  9. Linux系统编程20:基础IO之从内核代码深刻理解Linux是如何管理文件及文件描述符的本质是什么
  10. python电子病历交接班系统_专科电子病历
  11. L1-047 装睡-PAT团体程序设计天梯赛GPLT
  12. 研究生教育学科专业目录(2022年)与研究生教育学科专业目录管理办法
  13. Spring 学习记录6 BeanFactory(2)
  14. 樊登读书会终身成长读后感_终身成长读后感300字
  15. Android新浪微博开发(一)授权认证
  16. python打包deb_python开发将项目打包成deb
  17. meta中的http-equiv = X-UA-Compatible
  18. java字符串反转reverse();
  19. 我的iphone6退货之路
  20. 一、如何快速掌握数据库

热门文章

  1. Pycharm开发环境设置与熟悉。
  2. center os7 安装mysql
  3. 视音频数据处理入门:RGB、YUV像素数据处理【转】
  4. Windows系统安装Oracle 11g客户端
  5. Hello world!
  6. rhel5.5安装xwindow
  7. 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)
  8. jQuery 加法计算 使用+号即强转类型
  9. EXP6 信息搜集与漏洞扫描
  10. 有关Gradle Network is unreachable: connect的报错