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 很重要,而
且这里中文输入与网页所使用的字体编码有关。