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

posted @ 2023-07-21 18:17  _lyl  阅读(144)  评论(0编辑  收藏  举报