JavaWeb中的中文乱码问题
1. 分类
大致可分为请求(request)时乱码和响应(response)时乱码,其中request乱码又分为get和post两种请求情况,response乱码又分为字节流和字符流两种情况.
2. 乱码解决:
-|request: username=new String(username.getBytes("iso-8859-1"),"utf-8")在解决get和post情况都适用,是万能方式.
-|get:
String username=request.getParameter("username");
username= new String(username.getBytes("iso-8859-1"),"utf-8");//先iso-8859-1编码,再用utf-8重新解码
-|post:
request.setCharacterEncoding("utf-8");//设置缓冲区字符集
String username=request.getParameter("username");
-|response: response.setContentType("text/html;charset=utf-8")在解决字符和字节情况时是一种万能的方式,推荐使用!!
-|字符:
response.setChracterEncoding("utf-8");//设置缓冲区字符集(编码的字符集)
response.setHeader("content-type","text/html;charset=utf-8");//告诉浏览器显示的字符集(解码的字符集)
response.getWriter().write("内容");//使用字符流向页面输出中文
或者:
response.setContentType("text/html;charset=utf-8");//同时设置缓冲区字符集和页面显示使用的字符集
response.getWriter().write("内容");//使用字符流向页面输出中文
-|字节:
response.setHeader("content-type","text/html;charset=utf-8");//告诉浏览区显示页面使用utf-8字符集
response.getOutputStream().write("内容".getBytes("utf-8"));//使用字节流想页面输出中文
或者:
response.setContentType("text/html;charset=utf-8");//设置缓冲区字符集和页面显示使用的字符集
response.getOutputStream().write("内容".getBytes("utf-8"));//使用字节流向页面输出中文
3. 解释
request-get:
get请求提交的参数是在地址栏中传递的额,浏览器会对数据进行一次编码(Unicode编码),数据发送到服务器之后,服务器默认使用iso-8859-1进行解码,这样乱码就产生了。要知道我们程序是不应该改浏览器和服务器的字符集,所以,我们只能倒着编码和解码一次就可获得原来的字符。如图:
request-post:
post请求提交的参数是在请求体中传递的,数据会存放在request字符缓冲区里面,而缓冲区默认编码是iso-8859-1编码,所以我们只需要设置缓冲区编码为utf-8即可。
response-字符:
字符流是有缓冲区的, response设计默认的缓冲区编码是ISO-8859-1,这个字符集不支持中文的。所以一定会出现乱码问题,一旦出现乱码问题,我们只需要设置response字符流缓冲区的编码和设置浏览器默认打开时候采用的字符集一致即可
response-字节:
字节流响应中文方式向页面输出中文不一定乱码,因为当我们使用String对象的getBytes()方法编码时使用的是工作空间的字符集。一旦出现了乱码,我们只需要在调用getBytes()方法时设置编码的字符集,同时告诉浏览器显示页面也使用相同的字符集即可。