首先声明一下,此文章时从网上转载的。如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同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

java中处理字符编码(网页与数据库)(转)的更多相关文章

  1. java中的字符编码方式

    1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...

  2. 001. Java内存中的字符编码

    Java内存中的字符编码 Unicode字符集及utf-8 .utf-16.utf-32 等字符编码方式 字符集:字符表示的数字集合,元素称为码点或码位: 字符编码:字符实际的储存表示: 码点:一个码 ...

  3. java中的字符集和编码

    前言 上次对计算机中的“字符集”和“编码”分别进行了总结,并指出二者之间的区别,不要搞混了,不清楚的再回到上一章看一下.今天再总结下java中是如何使用字符集(主要是Unicode字符集,其他常用字符 ...

  4. Java IO4:字符编码

    前言 字符编码,这本不属于IO的内容,但字节流之后写的应该是字符流,既然是字符流,那就涉及一个"字符编码的"问题,考虑到字符编码不仅仅是在IO这块,Java中很多场景都涉及到这个概 ...

  5. 浅析白盒审计中的字符编码及SQL注入

    尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范.但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如g ...

  6. Java中面向字符的输入流

    Java中面向字符的输入流 2016-12-04 Java程序员联盟 Java程序员联盟 Java程序员联盟 微信号 javalm 功能介绍 莫道君行早,更有早行人 全心敲代码,天道自酬勤 字符流是针 ...

  7. java中URL 的编码和解码函数

    java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascri ...

  8. APACHE2.4 指定目录中的字符编码

    APACHE2.4 指定目录中的字符编码 xampp 的 apache2.4 默认字符编码是西文,中文字符显示乱码,在 httpd.conf 没有 AddDefaultCharset utf-8 这样 ...

  9. SpringBoot(八):SpringBoot中配置字符编码 Springboot中文乱码处理

    SpringBoot中配置字符编码一共有两种方式 方式一: 使用传统的Spring提供的字符编码过滤器(和第二种比较,此方式复杂,由于时间原因这里先不介绍了,后续补上) 方式二(推荐使用) 在appl ...

随机推荐

  1. 为VisualSVN Server增加在线修改用户密码的功能

    原文:为VisualSVN Server增加在线修改用户密码的功能 附件下载:点击下载 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便. 不过 ...

  2. Windows系统版本号判定那些事儿

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  3. [Cocos2d-x]解决Android平台ndk-build时不自动删除外部库

    参考链接: http://blog.chinaunix.net/uid-26009923-id-3430612.html http://hi.baidu.com/hpyfei/item/52a2b21 ...

  4. 用VBA宏从一个工作薄复制内容到另一个工作薄

    我们项目管理有两个工作薄,一个里面有多个表,每天建一个,记录当天项目,另一个工作薄,有多个表,其中一个是所有项目汇总. 以前都是第一个工作薄一个表做完,再复制粘贴到第二个工作薄的汇总表中. 写了个VB ...

  5. ubuntu 64位下安装wps

    首先,去官网下载wps.地址:http://community.wps.cn/download/ 然后切换到下载文件夹.运行例如以下命令: $ sudo apt-get install ia32-li ...

  6. 陈词滥调,正确使用memset

    前项目发现一个问题,计划永远是一个dynamic_cast当一个异常动态转换,搜索了半天才发现问题竟然是在memset使用,见.但当处于几十万行代码量级中时,就变得不太那么easy定位了. 本文归纳了 ...

  7. 【Qt for Android】OpenGL ES 绘制彩色立方体

    Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...

  8. 【Swift】—— 中国课程

    Apple宣布更换oc武器语言 Swift ,在牛叉的中国开发者社区9几天之内,以完成.这是福音许多中国的开发商啊,兴奋的发现之后,写存储在日志,马上防止忘记: GitHub开源项目:<The ...

  9. 使用WIX打包客户端程序

    原文:使用WIX打包客户端程序 用WPF为客户做了个小工具,打包的时候发现VS2012居然没有安装项目了,搜了下才知道现在推荐使用WIX来打包了http://wix.sourceforge.net/, ...

  10. Django之逆向解析url

    Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图, 获取相应的数据 ...