Servlet中解决乱码问题
编写Servlet时,常常需要和网页、数据库数据传输。这时候常常面临一个问题就是字符编码的问题。在学习的过程中,一个不小心就出现Servlet中是中文,到了网页就是乱码;或者在网页中是中文,到了Servlet中就变成了乱码;甚至出现在网页和Servlet中是中文,到了数据库就变成了乱码。今天就来总结一下怎么解决乱码问题。
静态网页的乱码
代码编码与浏览器编码的冲突
有时候我们在编写静态网页的时候,明明我们的代码在编辑器中是中文的,但是用了浏览器打开后就成了乱码。这是因为我们代码编辑器使用的编码和我们的浏览器的默认编码吗冲突照成的。当我们没有为网页设置编码集的时候,浏览器会使用默认的编码集来解析我们的网页。如果浏览器默认编码集和我们编写代码所用的编码集不一样的时候就会出现乱码问题。以谷歌浏览器为例,我们来查看浏览器的默认编码。
打开浏览器-[设置]-[高级设置]-[网络内容]-[自定义字体]-[编码],在编码中我们可以设置浏览器的默认编码。我们也可以使用谷歌浏览器的设置搜索功能来搜索。
在这里我们可以看到,此时浏览器的默认编码是GBK编码,如果我们使用GBK编码编写我们的静态网页代码的话,即便我们不设定编码浏览器也能正确解析网页。但是一旦我们把浏览器的编码修改为UTF-8,此时我们再用谷歌浏览器打开刚才的网页文件,就会出现乱码问题。
我们在编写静态网页的时候无法知道浏览器使用的默认编码是什么,我们如何来解决这个问题呢?其实HTML的初学者就知道解决方案是什么,就是在网页中设定浏览器应该使用的编码是什么。也就是使用meta标签设定编码。
在HTML4中使用meta标签设定编码的格式是:
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
在HTML5中使用meta标签设定编码的格式是:
<meta charset="utf-8">
通过meta标签,浏览器就知道我们的网页是使用什么编码编写,这样就能正确解析出网页内容不会出现乱码问题。
静态网页表单提交到Servlet中出现的乱码
编写好静态网页后,如果需要向Servlet提交数据,这个过程由客户端完成,叫做HTTP请求。在HTTP请求中的数据传输使用字符串进行传输,但是HTTP请求包含的消息使用的默认编码是 ISO-8859-1。如果我们的Java Servlet使用的UTF-8编码的话,并且请求中包含中文,我们直接获得字符就会变成乱码。
既然我们知道HTTP请求中使用的默认编码是ISO-8859-1,那么我们就可以在程序中对字符串进行转码了。在Java中字符串的转码我们使用String类型的一个重载构造函数和一个将字符串转为字节码的方法。
String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 Stringbyte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
Java代码如下:
String str = new String(request.getParameter("text").getBytes("ISO-8859-1"),"UTF-8");
使用Servlet动态生成网页产生的乱码问题
我们使用Servlet动态生成网页的时候,也可能产生乱码。Servlet向客户端传送数据的时候,一般使用的是Servlet的默认编码(编写Servlet的编码)。我们发送的数据编码和我们代码使用的编码相同。这个时候我们有两种解决方法。
我们把动态生成的网页结果看成一个静态网页。还记得我们编写静态网页的时候是怎么处理乱码问题的吗?我们依然可以在动态网页中编写标签处理乱码问题。
2.我们还可以通过设置response的编码来契合浏览器的编码。通过response.setCharacterEncoding(“UTF-8”)方法可以设置我们的回应信息的编码。
Servlet与数据库交互产生乱码
- 数据库的编码
数据库使用什么编码存储数据,我们发送到数据库的数据一定也要使用对应的编码。 - jdbc的编码
jdbc是链接数据库的驱动类,相当于我们的数据进入数据库前的时候还要经过jdbc。但是jdbc使用什么编码传输数据呢?我不知道,但是jdbc给我们了方法设置jdbc传输数据使用编码的方法。具体代码如下:
url:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8