对于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时的编码乱码问题的更多相关文章

  1. 解决web浏览器与servlet之间传输数据时出现的乱码问题

    1.使用getParam等方法获取请求参数时遇到乱码 浏览器发送的请求参数使用的编码就是打开网页时使用的编码.如果服务器端获取到发过来的请求参数,默认使用ISO8859-1进行解码操作,中文一定会有乱 ...

  2. Javac 手动编译时,出现乱码或编码格式问题

    使用Javac进行手动编译时,出现乱码或编码格式问题,原因如下:现象:编译时出现乱码或编译错误 即使改成UTF-8仍然会出错 原因如下:某些编辑器会往utf8文件中添加utf8标记(editplus称 ...

  3. Servlet处理get请求时的中文乱码问题

    我们都知道,使用Servlet处理get请求时,如果get请求的参数中有中文,直接接收会是乱码,这个时候我们使用类似下面的语句来处理乱码: 12345 String name = request.ge ...

  4. Maven 执行Javadoc时控制台输出乱码问题

    1.0  Maven 执行Javadoc时控制台输出乱码问题 问题描述 最近项目中使用maven-javadoc-plugin生成javadoc时,myEclipse控制台乱码. 插件配置 问题分析 ...

  5. jsp页面写入中文到mysql时出现了乱码(转)

    今天自己在用jsp把中文写入mysql的时候出现乱码,从数据库中读取出来的时候也显示为“??”,感觉应该出现了编码转换过程中的字符信息丢失.然后在mysql中直接执行该命令,发现中文是正常的,所有认为 ...

  6. action接收到来自jsp页面的请求时出现中文乱码问题处理方法

    写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了.由于在JSP中使用了GBK作用页面的编码,那么提交的中文信息自然也会被按着GBK进行编码,为%xx格式的GBK ...

  7. mysql字符集编码乱码测试如下

    创建三个表tb_latin1,tb_utf8,tb_gbk,编码分别为latin1/utf8/gbk “你好a”字符串编码如下GBK : %C4%E3 %BA%C3 %61UTF-8 : %E4%BD ...

  8. Java web中常见编码乱码问题(二)

    根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...

  9. 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

     通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...

随机推荐

  1. 好程序员告诉你HTML好在哪里,为什么值得我们学习

    好程序员告诉你HTML好在哪里,为什么值得我们学习,HTML5对于用户来说,提高了用户体验,加强了视觉感受.HTML5技术在移动端,能够让应用程序回归到网页,并对网页的功能进行扩展,用户不需要下载客户 ...

  2. 第一次java作业

    学习了c语言半个学期,好像刚开始并不担心Java,因为Java也是类同于C语言的一种语言,可是Java学到现在也将近一个月,在我脑子里现在却还没有一个框架,有点着急了.

  3. 自定义 js 文件的集成引用

    这里的内容, 提前要知道  import comm from ‘...’  和 import {  comm }  from ‘...’ 的基础知识. 我举个案例, 当你有很多api文件的时候, 比如 ...

  4. Object 与 T的差别 导致swagger 的model 显示的数据为空

    情景复现: 在整合swagger的时候,自己对原本定于的Object的data做了修改,把Object修改为了T,data的set方法的返回类型由于编译器没有报错,就没有去做修改, 这个时候就导致了, ...

  5. WiFi攻击中“核武器”

    3·15晚会上,央视曝光了WiFi探针盒子通过手机MAC地址.大数据匹配获取手机用户个人信息的典型案例. 其中,曝光的“声牙科技有限公司”号称有全国6亿手机用户的个人信息,包括手机号,只要将获取到的手 ...

  6. 微信支付之01------获取订单微信支付二维码的接口------Java实现

    [ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...

  7. MyBatis-Plus

    一.通用SQL 1.简介:(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 2.定义Javabean中成员变量所使用的的类型: ...

  8. element 给table的个别表格框添加样式 ---重构里面的组件

    <el-table ref="singleTable" :show-header='false' :data="tableData" align='cen ...

  9. Nginx PRECONTENT mirror模块

    L62 location = /mirror { internal ; //只能内部访问 proxy_pass http://sho***.com.cn:8011$request_uri; proxy ...

  10. 利用ir.sequence自动生成序列号

    利用ir.sequence自动生成序列号 什么是序列号 可以这么理解,我有一个产品序号,编码的前缀是SOP,后缀是0001~9999的序号,没生成一个产品就自动流水加一,序列号不会重复,odoo中的i ...