中文乱码问题可以按请求过程,从以下几个方面查找
首先客户端发起请求
1、客户端 form 表单所在页面,即浏览器页面编码
form 表单提交 nameText 为 李白
http://192.168.1.105:8080/mySites/Hello?nameText=李白
浏览器设置编码 utf-8 实际 url:
http://192.168.1.105:8080/mySites/Hello?nameText=%E6%9D%8E%E7%99%BD
浏览器设置编码 gbk 实际 url :
http://192.168.1.105:8080/mySites/Hello?nameText=%C0%EE%B0%D7
2、服务器收到请求
服务器收到的请求,其默认的编码是 ISO-8859-1
// 将 post 请求中的参数转成 utf-8 编码
// 是设置对客户端 post 请求和数据库取值时的编码,不指定的话使用iso-8859-1
request.setCharacterEncoding("utf-8");
// 此时 str 为 utf-8
String str=req.getParameter("nameText");
// 对于 get 请求中的
String utfString=new String(str.getBytes("ISO8859_1"),"utf-8");
解决GET乱码可以修改tomcat的server.xml中的 URIEncoding属性
或使用
str = new String(str.getBytes("iso-8859-1"),"utf-8");
3、访问数据库时向数据库传递的参数编码,
4、从数据库取出的数据的编码
5、响应页面编码设置
//设置 HTTP 响应的编码
resp.setCharacterEncoding("utf-8");
//设置响应头
resp.setHeader("Content-Type","text/html;charset=utf-8");
// 等效上面两个一起用,同时额外 告诉浏览器应该以什么编码方式的页面显示
resp.setContentType("text/html;charset=utf-8");
前两个要一起用
// tomcat 7 chrome 输出使用 jsp <%="***??你好????x?????*??****"%>
实际测试 resp.setCharacterEncoding 和 resp.setHeader 都会改变响应头的字段
Content-Type: text/html;charset=utf-8
两个设置不一样的时候以后者为准
response.setCharacterEncoding("gbk");
response.setHeader("Content-Type","text/html;charset=utf-8");
6、jsp 、html 文件本身的编码
在编写 jsp 代码的时候,使用的编辑器是以哪种编码形式保存的需要注意
如 vscode 修改文本编码格式
image.png
网友评论