JavaWeb处理GET、POST时的编码乱码问题
对于GET方法,只要设置了res.setContentType("text/html;charset=UTF-8"), req.getParameter()就不会产生乱码。
对于POST方法,req.getQueryString()会返回null, req.getParameter()会产生乱码
需要用new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")来得到正确的编码。
测试代码如下:
out.println("req.getParameter(\"e\"):"+req.getParameter("e")+"</br>");
out.println("req.getParameter(\"e\"):"+new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")+"</br>");
out.println("java.net.URLEncoder.encode(\"叫苦连天二胎\", \"utf-8\"):"+"</br>"+java.net.URLEncoder.encode("叫苦连天二胎", "utf-8")+"</br>");
byte[] bs = req.getParameter("e").getBytes("iso-8859-1");
for (byte b: bs) {
out.print("%"+Integer.toHexString(0x000000ff&b).toUpperCase());
}
out.println("</br>");
浏览器显示结果:

根据
java.net.URLEncoder.encode("叫苦连天二胎", "utf-8")
的输出结果
%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E
与
java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "iso-8859-1")
的输出结果
å«è¦è¿å¤©äºè
对比可以看到,浏览器发送get、post请求时根据网页设定的编码将字符转化问网页的编码用%分隔,在本例中是UTF-8编码每个字节用一个%分隔。
例如, 叫苦连天二胎 的编码的 E58FABE88BA6E8BF9EE5A4A9E4BA8CE8838E ,每个字节前面加上一个%就变成了
%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E
而tomcat收到GET请求时,直接用req.getParameter("e")时内部会使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "utf-8") 会获得正确的字符 叫苦连天二胎 。
对于POST请求,直接用req.getParameter("e")会得到乱码 å«è¦è¿å¤©äºè ,因为tomcat内部会使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "iso-8859-1") 从而得到错误的 å«è¦è¿å¤©äºè 。此时我也应该使用先使用 java.net.URLEncoder.encode(req.getParameter("e"),"iso-8859-1") 把 å«è¦è¿å¤©äºè 还原成 %E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%%8E 然后再使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "utf-8") 解码即可得到正确的字符 叫苦连天二胎 ,代码如下:
java.net.URLDecoder.decode(java.net.URLEncoder.encode(req.getParameter("e"),"iso-8859-1"), "utf-8")
即可得到正确的结果。 如下图:

JavaWeb处理GET、POST时的编码乱码问题的更多相关文章
- 解决web浏览器与servlet之间传输数据时出现的乱码问题
1.使用getParam等方法获取请求参数时遇到乱码 浏览器发送的请求参数使用的编码就是打开网页时使用的编码.如果服务器端获取到发过来的请求参数,默认使用ISO8859-1进行解码操作,中文一定会有乱 ...
- Javac 手动编译时,出现乱码或编码格式问题
使用Javac进行手动编译时,出现乱码或编码格式问题,原因如下:现象:编译时出现乱码或编译错误 即使改成UTF-8仍然会出错 原因如下:某些编辑器会往utf8文件中添加utf8标记(editplus称 ...
- Servlet处理get请求时的中文乱码问题
我们都知道,使用Servlet处理get请求时,如果get请求的参数中有中文,直接接收会是乱码,这个时候我们使用类似下面的语句来处理乱码: 12345 String name = request.ge ...
- Maven 执行Javadoc时控制台输出乱码问题
1.0 Maven 执行Javadoc时控制台输出乱码问题 问题描述 最近项目中使用maven-javadoc-plugin生成javadoc时,myEclipse控制台乱码. 插件配置 问题分析 ...
- jsp页面写入中文到mysql时出现了乱码(转)
今天自己在用jsp把中文写入mysql的时候出现乱码,从数据库中读取出来的时候也显示为“??”,感觉应该出现了编码转换过程中的字符信息丢失.然后在mysql中直接执行该命令,发现中文是正常的,所有认为 ...
- action接收到来自jsp页面的请求时出现中文乱码问题处理方法
写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了.由于在JSP中使用了GBK作用页面的编码,那么提交的中文信息自然也会被按着GBK进行编码,为%xx格式的GBK ...
- mysql字符集编码乱码测试如下
创建三个表tb_latin1,tb_utf8,tb_gbk,编码分别为latin1/utf8/gbk “你好a”字符串编码如下GBK : %C4%E3 %BA%C3 %61UTF-8 : %E4%BD ...
- Java web中常见编码乱码问题(二)
根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析: 2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...
- 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表
通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...
随机推荐
- video相关参数、操作和事件
1.参数 video是h5的新特性(虽然新了很多年了),使得枯燥的页面有了很多生机.html代码示例: <video id="kingdom-video" src=" ...
- ASP.NET Core 2.1与2.2 SignalR CORS 跨域问题
将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,本地访问没有问题,但是发布之后一直报跨域问题,本地是这样设置的: Asp.net core 2. ...
- 升级:DNAtools for Excel工具箱,2.x英文版- VBA代码破解工具
原始出处:www.cnblogs.com/Charltsing/p/DnaTools.html QQ:564955427 DNA工具箱全部功能一览: 单元格焦点指示(支持Excel 2007~2 ...
- Python中的 sort 和 sorted
今天在做一道题时,因为忘了Python中sort和sorted的用法与区别导致程序一直报错,找了好久才知道是使用方法错误的问题!现在就大致的归纳一下sort和sorted的用法与区别 1. sort: ...
- python之路8-内置模块介绍
time & datetime模块 1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 6 7 # print(t ...
- springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany
springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...
- ES6 对象增强
对象字面量语法扩展: 1, 属性初始化语法简写:给一个属性赋一个变量值,如果变量名和属性名相同,可以省略变量名和冒号,直接写属性名,js引擎在执行代码的时候,自动查找 和属性命名相同的变量并赋值. l ...
- sass基本用法
什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常 ...
- Mint-UI组件 MessageBox为prompt 添加判断条件
Mint-UI 的Message Box 是prompt类型时,可以添加正则判断或者function判断条件.具体可以查看Mint-UI源码. 添加正则判断条件: MessageBox({ $type ...
- settings 配置 + 测试环境搭建
若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', ...