在实际工作中,会遇到很多中文数据的乱码的问题,之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。
1、以POST方式提交表单中文参数的乱码问题
客户端是以UTF-8字符编码将表单数据传输到服务器端,因此服务器也需要设置以UTF-8字符编码进行接收,服务器可以直接使用从ServletRequest接口继承而来的"setCharacterEncoding(charset)"方法进行统一的编码设置。代码如下:
public void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
/**
* 客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收 */
request.setCharacterEncoding("UTF-8");
}
2、以GET方式提交表单中文参数的乱码问题
如果是用get的方式提交表单,通过request.setCharacterEncoding("UTF-8");这种方式是解决不了中文乱码问题
对于以get方式传输的数据,默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端的编码不一致。
解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。代码如下:
public void doGet(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
/**
* 对于以get方式传输的数据,request默认的还是使用ISO8859-1编码接收数据
*/
String name = request.getParameter("name");//接收数据
name =new String(name.getBytes("ISO8859-1"),"UTF-8") ;//将ISO8859-1字符转换为UTF-8
}
3、以超链接(URL)形式传递中文参数的乱码问题
超链接数据是以get的方式传输到服务器的,所以接收中文数据时也会产生中文乱码问题,而解决中文乱码问题的方式与上述的以get方式提交表单中文数据乱码处理问题的方式一致。
4、中文数据乱码问题总结
1、如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding("UTF-8"))
2、如果提交方式为get,设置request对象的编码是无效的,request对象还是以默认的ISO8859-1编码接收数据,需要将ISO8859-1编码数据转换为需要的编码类型,比如UTF-8:
String name =request.getParameter("name");//接收数据
name =new String(name.getBytes("ISO8859-1"),"UTF-8") ;//将ISO8859-1字符转换为UTF-8
3、如果是使用链接直接提交数据,那么参考get的提交方式;
4、中文数据乱码的终极解决之道,就是让系统在传输过程中,没有中文,那么自然就没有了乱码一说。简单的说,就是把中文在数据传输之前做转码,在数据传输之后做解码。
比如:
java.net.URLEncoder.encode("要转码的内容","UTF-8"); //
原来单参数方法已经过时。
如果仔细观察,我们在百度搜索之后,百度的中文都会变成编码符号传输,用的就是encode的方法。
用百度搜索:中文乱码
如果能看到链接的话,内容如下:http://www.baidu.com/s?ie=UTF-8&wd=%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81