servlet 总结了几种自己遇到的乱码问题
一、使用servletContext读取properties文件并response出现的乱码问题
1、response乱码
指服务器响应输出到浏览器,出现乱码。
乱码就是A和B的默认设置有问题。
2、为什么默认设置会导致中文乱码?
idea中创建和打开文件使用的字符集为Unicode,输出时默认的编码方案A为UTF-8
浏览器默认的编码方案B为ISO_8859_1,不支持中文,所以浏览器接收到了UTF-8编码的数据,用ISO_8859_1解码就会出现乱码。
3、解决方案
为了使浏览器正确显示中文,可以
(1)修改浏览器的编码方案B,改成使用UTF-8解码
可以设置http响应报文的请求头,将浏览器的解码方式设置为UTF-8
resp.setContentType("text/html;charset=UTF-8"); //设置编码方案B
(2)AB都需要设置为同一种支持中文的编码方案,比如GBK
resp.setCharacterEncoding("GBK"); //设置编码方案A
resp.setContentType("text/html;charset=GBK"); //设置编码方案B
二、getResourceAsStream()读取乱码
1、原因
这个问题与servlet关系不大,是关于IO流的知识点。
getResourceAsStream()出现于使用servletContext读取资源的时候,因为getResourceAsStream()返回的是字节流,如果需要读字符,需要将字节流转化成字符流,并指定编码方案,如下图
所以,字符流的传输才会涉及编码、乱码的问题(字节流的传输涉及的是文件格式的问题)
2、正确代码
三、URL/请求头的中文
URLEncoder.encode(str, "UTF-8");
URLDecoder.decode(str, "UTF-8");
四、服务器接收到的http请求的乱码
req.setCharacterEncoding("UTF-8"); // 将request中的数据用UTF-8编码
resp.setContentType("text/html;charset=UTF-8"); // 告诉浏览器,响应内容用UTF-8编码,需要它以UTF-8解码
参考
https://blog.csdn.net/xiazdong/article/details/7217022
https://blog.csdn.net/weixin_44167920/article/details/111357047