JSP中文乱码问题解决办法
当用request对象获取客户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊处理。
常见的几种字符集编码:
⏹ ASCII码:不支持中文
⏹ ISO-8859-1:不支持中文
java和jsp⏹ GB2313、GBK:支持中文
⏹ Unicode:支持中文
⏹ UTF-8:支持中文
在解决JSP中文乱码问题前,弄清以下几点:
(1) windows平台采用的默认字符集编码是:GBK
(2) IE浏览器默认采用UTF-8字符集编码方式发送Http请求。
(3) Tomcat在处理Get请求时,永远采用ISO-8859-1编码;
Tomcat在处理Post请求时,默认采用ISO-8859-1编码;如果进行了如下设置request.setCharacterEncoding(“GBK”),则采用GBK编码。
可以使用如下几种方式解决JSP中文乱码问题。
1、方法一:调用自定义的转换函数
<%@ page contentType="text/html;charset=GB2312" %>
<%!
public String getStr(String s) {
String str = s;
try {
byte[] b = Bytes("ISO-8859-1");
str = new String(b);
return str;
} catch (Exception e) {
return str;
}
}
%>
使用内置对象request将获取的数据,使用ISO-8859-1进行重新编码,并保存到一个字节数组中,然后调用new String()方法,以GBK方式将这个字节数组构造出一个新的字符串,这个新的字符串就是我们想要的结果。
适用于以下三种情况:
(1) 以Get方式提交表单,提交的数据中包含汉字字符。
(2) 以Post方式提交表单,提交的数据中包含汉字字符。
(3) 在浏览器的地址栏中发出Http请求时,查询字符串中包含汉字字符。
2、方法二:调用request.setCharacterEncoding(“GBK”);
<%@ page contentType="text/html;Charset=GB2312" pageEncoding="GBK" %>
<% request.setCharacterEncoding("GB2312"); %>
由于Tomcat服务器处理Get请求或Post请求时,默认采用的编码方式是ISO-8859-1,通过内置对象request的getParameter()方法得到的字符串是以ISO-8859-1转换而来,这是导致乱码产生的原因之一。
为了避免Tomcat以ISO-8859-1的编码方式返回字符串,对于以Post方式提交的表单数据,可以在通过内置对象request获取数据之前,调用request.setCharacterEncoding(“GBK”),明确指定对浏览器发送来的数据进行重新编码(或者称为解码)时,采用的GBK的编码方式。
适用于以下情况:
(1) 以Post方式提交表单,提交的数据中包含汉字字符。
3、在数据库中存储和读取中文数据
在Java编程中,中文字体编码难倒了不少程序员,如果抓住了影响Java中文显示的几个关键因素,问题将迎刃而解。
Java是目前最流行的面向对象的编程语言之一,Java支持UTF-8、ISO-8859-1、GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,笔者特意总结如下。
影响Java中字体编码正确显示的有几个因素: 1)数据库的连接方式; 2)网页中使用的字体编码; 3)数据库里存放数据的字体编码; 4)Java的缺省字体编码。如果在编程中遇到不能正确显示中文时,要先弄清楚以上几项所使用的字体编码,再分析出原因,即可解决问题。
众所周知,JSP是Java的一种,和网页有关,而网页也有自己的中文编码系统,所以JSP处理中文要比纯Java的类文件更为麻烦。本文的测试数据库是MySQL3.2,数据库连接驱动是用sql.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 Bytes(1),"UTF-8")或者String(1),可以正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new Bytes(1),"GBK")来显示正确的中文。值得注意的是如果页面使用UTF-8,数据库里存放的是UTF-8,也可以用str=new
Bytes(1),"GBK")正确显示中文。如果网页是UTF-8,而数据库里存放的是GBK,无法直接显示中文,需要2步转换, str=new Bytes(1),"GBK"); 再str=new Bytes("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 Bytes(1),"UTF-8"),才正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new Bytes(1),"GBK") 或者直接使用String(1),即可显示正确的中文。 如果网页是UTF-8,而数据库里存放的是GBK,只能用str=new String(1).getBytes("UTF-8"),"GBK")的方法来显示中文; 如果网页是UTF-8,而数据库里存放的是UTF-8,可用str=new Bytes(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 Bytes(1),"UTF-8") 或者str= new String(1).getBytes("ISO-8859-1"),"UTF-8"),才可正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new Bytes(1),"GBK")或str=new String(1).getBytes("ISO-8859-1"),"GBK") 显示正确的中文。
2. 如果网页是UTF-8,不能直接正确显示GBK,需要2步转换,str=new Bytes(1),"GBK"),再str=new Bytes("UTF-8"),"GBK") 才可以正确显示中文。如果数据库里存的是UTF-8,直接用str=new Bytes(1),"GBK")或者str=new String(1).getBytes("ISO-8859-1"),"GBK")就可以显示中文了。
以上是读取数据库里中文正确显示在网页上,下面三点是如何正确存入数据库。
四、数据库连接方式使用UTF-8编码
JSP中要把网页输入的中文存入数据库,通常有一个提交(Submit)的过程,是用Parameter("username"),然后执行update或者insert语句来存入数据库。如何赋值给str很重要,而且这里中文输入与网页所使用的字体编码有关。
1、 网页使用UTF-8,使用str= new Parameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new Parameter("username").getBytes(),"UTF-8"),都可以使得存到数据库里的数据是UTF-8编码。
2. 网页使用GBK,使用str= new Parameter("username").getBytes(),"GBK"),那么存入数据库的是UTF-8编码。
3. 值得注意的是使用UTF-8的数据库连接方式不能存得GBK。
五、数据库连接方式使用GBK编码
1. 输入使用GBK网页,存到数据库里是GBK的方法: str= new Parameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new Parameter("username").getBytes(),"GBK")。
2. 网页使用GBK,想存入UTF-8到数据库里,要分2步: 先str=new Parameter("username").getBytes(),"GBK"),再str=new Bytes("UTF-8"),"GBK")即可。
3. 网页使用UTF-8,而且使用str= new Parameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new Parameter("username").getBytes(),"UTF-8"),那么存到数据库里的数据是UTF-8编码。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论