黑马程序员技术交流社区
标题:
【石家庄校区】中文乱码问题的分析和解决方法
[打印本页]
作者:
hbtian321
时间:
2017-11-28 19:46
标题:
【石家庄校区】中文乱码问题的分析和解决方法
本帖最后由 小石姐姐 于 2017-11-29 13:51 编辑
首先在servlet里,常用传参的方式有get和post,在乱码的处理上这两种方式是有区别的,在了解如何处理之前,先谈谈这种区别是如何产生的,而想要弄明白产生这种区别的原因,需要先了解的是:
{:8_494:}
GET方式的参数在请求行上,在进入Servlet的时候就已经获得参数了;
POST方式的参数在请求体内,需要request.getParameter()来获得参数;
而在request接收参数的时候,数据封装到Servlet中的request中,request有一个缓冲区会将接收的数据进行字符集ISO-8859-1编码,而我们的workspace使用的是UTF-8的编码,所以,我们需要设定request的缓存区的字符集,
设置request的缓存区代码:
request.setCharacterEncoding("UTF-8");
{:8_492:}
这样就可以解决post方式的乱码问题,但是却无法解决GET方式的乱码,这是因为:
request.setCharacterEncoding("字符集") 必须用在 request.getParameter() 获得参数之前,否则是无效,request.getParameter()之后,参数已经经过了request的缓冲区,我们再设定字符集就没有意义了;
{:8_487:}
GET方式的参数在请求行上,在进入Servlet的时候就已经被获取了,所以不可以用request.setCharacterEncoding("字符集");而POST方式的参数在请求体内在 request.getParameter() 之前不会经过request的缓冲区,所以可以用 request.setCharacterEncoding("字符集")的方式来解决乱码;
GET方式解决乱码的问题,有三种的解决方法,这里就稍微提一下:
方案1(极其不推荐):修改tomcat的字符集的编码
方案2(不推荐):使用URLEncoder和URLDecoder进行编码和解码的操作,将request中被ISO-8859-1解码出的字符串再用ISO-8859-1编码回去,之后再用UTF-8解码
URLEncoder.encode() 和 URLDecoder.decode();
先用URLDecoder.decode(String s ,"ISO-8859-1");编码
然后用URLEncoder.encode(String s ,"UTF-8");进行解码
方案3(推荐):使用String类的一个构造方法 String(byte[] bytes,String charsetName) :通过制定的字符集对字节数组进行解码:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
下面贴出request和response解决中文乱码问题的方法,可以直接取用:
request:
GET方式:
String 参数 = new String(request.getParameter("参数").getBytes("ISO-8859-1"),"UTF-8");
POST方式:
request.setCharactEncoding("UTF-8")
response:
response输出响应内容中文解决乱码的方法:
ServletOutputStream getOutputStream():字节流
设置中文转成字节数组的时候的编码:write("中文".getBytes("UTF-8"))
设置浏览器默认打开的时候编码:response.setHeader("Content-Type","text/html;charset=UTF-8")
PrintWriter getWriter():字符流
解决字符流乱码的封装方法:response.setContentType("text/html;charset=UTF-8");
补充:框架中,也有对解决中文乱码问题的封装,例如Struts2的struts.xml中配置常量的方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2