位置: IT常识 - 正文

Request获取请求数据中文乱码问题

编辑:rootadmin
Request获取请求数据中文乱码问题

目录

一、当Request请求字母时,输出正常

二、当Request请求参数为汉字时

三、使用伪代码了解乱码的形成

URL编码

四、Request请求参数中文乱码-Post请求解决方案

五、Request请求参数中文乱码-Get请求解决方案


推荐整理分享Request获取请求数据中文乱码问题,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

前言:Tomcat在7以及更低版本时,解析中文的字符集默认为ISO-8859-1,并且是在底层写死的,所以浏览器发送Get请求或者时Post请求时,字符集格式不匹配,从而引发中文乱码。但是Tomcat更新到8版本后,默认字符集就更换为了UTF-8。

一、当Request请求字母时,输出正常package com.huanle.web;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @author 欢了 * @version 1.0 */@WebServlet("/req3")public class RequestDemo3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("==========字母情况下==========="); String username = request.getParameter("username"); System.out.println(username); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}

 启动Tomcat 在输入框 姓名里 输入字母abc

 点击提交跳转到上面代码开始执行

控制台打印abc

一切正常

二、当Request请求参数为汉字时

启动Tomcat 在姓名框中输入中文  张三

跳转页面

看控制台的输出

 输入的张三在控制台里呈现的就是乱码

三、使用伪代码了解乱码的形成

解决乱码问题之前,首先我们要了解乱码的形成。

我们写一个测试类,里面用到了URL编码,我们先了解一下;

URL编码

1. 将字符串按照编码格式转为二进制

2.每个字节转为2个16进制数,并在前面加上 %

例如  张三

Request获取请求数据中文乱码问题

假设浏览器给Tomcat发送的字符集格式为UTF-8,即编码格式为UTF-8;Tomcat也用UTF-8来接收,即解码格式也为UTF-8,那么就可以正常的接收到  "张三" 。

但是由于tomcat的默认解码是ISO-8859-1,并且还是底层是写死的,就只能走下面示例tomcatDecode对象(乱码)。

tomcatDecode对象直接转UTF-8虽然会出问题,但是底层的二进制是不会变的,我们就有了一个思路:

先将tomcatDecode的解码%E5%BC%A0%E4%B8%89 转为字节数组(-27 -68 -96 -28 -72 -119)

再将字节数组转为字符串。

package com.huanle.web;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;/** * @author 欢了 * @version 1.0 * * 演示浏览器的URL编码 和 tomcat的URL解码 * 以及解决默认tomcat字符集中文乱码 */public class UrlDemo { public static void main(String[] args) throws UnsupportedEncodingException { String username = "张三"; //URL编码 String encode = URLEncoder.encode(username, "UTF-8"); System.out.println(encode);//%E5%BC%A0%E4%B8%89 //URL解码 String decode = URLDecoder.decode(encode, "UTF-8"); System.out.println(decode);//张三 //但是tomcat的默认解码是ISO-8859-1,并且底层是写死的 String tomcatDecode = URLDecoder.decode(encode, "ISO-8859-1"); System.out.println(tomcatDecode); /** * 解决get请求的中文乱码 * 将tomcat的乱码,先用tomcat默认的字符集ISO-8859-1转为字节数组 编码 * 再将字节数组转为字符串 解码 * */ byte[] bytes = tomcatDecode.getBytes("ISO-8859-1"); //可以先遍历看一下 for (byte b : bytes) { System.out.print(b + " "); }//-27 -68 -96 -28 -72 -119 //换行 System.out.println(); //将这些十进制转为字符串 String s = new String(bytes, "UTF-8"); System.out.println(s);//张三 }}

最终的结果如下:

 

 四、Request请求参数中文乱码-Post请求解决方案

讲完上面的案例,大家也就知道为什么中文会出现乱码了,我们就在代码中解决

因为Post是通过流的getReader()方法来传输数据,只需要改变流的编码格式为utf-8即可

我们需要用到一个方法   setCharacterEncoding("");        //这里的参数是编码格式

启动Tomcat 姓名为   张三

跳转页面后没有显示请求参数 ,所以是Post请求

 

package com.huanle.web;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @author 欢了 * @version 1.0 * * 中文乱码解决方案 */@WebServlet("/req4")public class RequestDemo4 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.先解决乱码问题Post,因为Post是通过流getReader()方法 传输数据,改变流的编码格式为utf-8 request.setCharacterEncoding("utf-8"); //2.获取username System.out.println("==========获取username========="); String username = request.getParameter("username"); System.out.println("解决后" + username); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}

 

输出正常! 解决~

五、Request请求参数中文乱码-Get请求解决方案

get请求就很像我们举得测试类里的例子

先将乱码的数据转成字节数组

再将字节数组转成字符串

package com.huanle.web;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @author 欢了 * @version 1.0 * * 中文乱码解决方案 */@WebServlet("/req4")public class RequestDemo5 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取username System.out.println("==========获取username========="); String username = request.getParameter("username"); System.out.println("解决前:" + username); //2.解决乱码问题Get Get是通过getQueryString // 乱码原因,tomcat进行URL解码的时候用的是ISO-8859-1的字符集,和页面字符集不匹配 // 解决方案: // 2.1 先将乱码的数据转成字节数组 // 2.2 再将字节数组转成字符串 byte[] bytes = username.getBytes("ISO-8859-1"); String s = new String(bytes, "UTF-8"); System.out.println("解决后:" + s); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}

 启动Tomcat

跳转页面,有显示参数,表明是Get请求

 

 输出正常!解决~

本文链接地址:https://www.jiuchutong.com/zhishi/295184.html 转载请保留说明!

上一篇:uni-app 从0 到 1 制作一个项目,收藏等于学会(uni-app实战教程)

下一篇:【创作赢红包】ChatGPT引爆全网引发的AI算力思考

  • 电脑关不了机一直转圈(电脑关不了机)(电脑关不了机一直显示正在关机)

    电脑关不了机一直转圈(电脑关不了机)(电脑关不了机一直显示正在关机)

  • 微信查全年消费总额的方法是什么(微信如何查全年消费)

    微信查全年消费总额的方法是什么(微信如何查全年消费)

  • 魅族手机一直重启循环是怎么回事(魅族手机一直重启循环怎么回事)

    魅族手机一直重启循环是怎么回事(魅族手机一直重启循环怎么回事)

  • 快手怎么没有精选(快手是最新版本为什么没有精选)

    快手怎么没有精选(快手是最新版本为什么没有精选)

  • 苹果x为什么突然掉电厉害(苹果x为什么突然没有声音了)

    苹果x为什么突然掉电厉害(苹果x为什么突然没有声音了)

  • 佳能打印机无法手机打印(佳能打印机无法扫描怎么回事)

    佳能打印机无法手机打印(佳能打印机无法扫描怎么回事)

  • 虎牙注销账号多久生效(虎牙 注销)

    虎牙注销账号多久生效(虎牙 注销)

  • 视频压缩失败发不出去怎么办(视频压缩失败发送不了怎么回事)

    视频压缩失败发不出去怎么办(视频压缩失败发送不了怎么回事)

  • 华为nova7pro电池容量(华为nova7pro电池多少毫安)

    华为nova7pro电池容量(华为nova7pro电池多少毫安)

  • 美团钱包进不去怎么办(美团钱包加载不出来)

    美团钱包进不去怎么办(美团钱包加载不出来)

  • 怎样清除淘宝里已完成的交易记录(怎样清除淘宝里的垃圾)

    怎样清除淘宝里已完成的交易记录(怎样清除淘宝里的垃圾)

  • 手机主卡和副卡有什么区别吗(手机主卡和副卡是什么关系)

    手机主卡和副卡有什么区别吗(手机主卡和副卡是什么关系)

  • oppo怎么呼叫语音助手(op怎么呼叫语音)

    oppo怎么呼叫语音助手(op怎么呼叫语音)

  • 抖音聊天记录删了怎么恢复(抖音聊天记录删了还可以恢复吗)

    抖音聊天记录删了怎么恢复(抖音聊天记录删了还可以恢复吗)

  • 安卓怎么开热点(安卓怎么开热点给电脑)

    安卓怎么开热点(安卓怎么开热点给电脑)

  • 微信红旗头像怎么弄(微信红旗头像怎么搞)

    微信红旗头像怎么弄(微信红旗头像怎么搞)

  • oppor15有没有红外遥控功能(oppor15有红色吗)

    oppor15有没有红外遥控功能(oppor15有红色吗)

  • iphone11怎样使黑边变小(苹果11怎么调黑暗模式)

    iphone11怎样使黑边变小(苹果11怎么调黑暗模式)

  • ios怎么换壁纸(苹果手机换壁纸怎么换)

    ios怎么换壁纸(苹果手机换壁纸怎么换)

  • 荣耀20pro怎么设置时间24小时(荣耀20pro怎么设置关闭套餐外流量)

    荣耀20pro怎么设置时间24小时(荣耀20pro怎么设置关闭套餐外流量)

  • 苹果无线键盘怎么连接(苹果无线键盘怎么打开蓝牙)

    苹果无线键盘怎么连接(苹果无线键盘怎么打开蓝牙)

  • 小米mi4lte是全网通吗(小米型号mi4lte参数)

    小米mi4lte是全网通吗(小米型号mi4lte参数)

  • soul删除聊天记录对方还有吗(soul删除聊天记录怎么找回)

    soul删除聊天记录对方还有吗(soul删除聊天记录怎么找回)

  • realmex什么时候上市(realmex什么时候停产)

    realmex什么时候上市(realmex什么时候停产)

  • 如何在淘宝发布二手物品(如何在淘宝发布视频)

    如何在淘宝发布二手物品(如何在淘宝发布视频)

  • 个人退税需要多少天
  • 税务师补报名时间可以交费吗
  • 收入及增值税会计准则
  • 烟叶税税率计算方法
  • 核定征收变更查账征收利润怎么办
  • 进项抵扣税率是多少
  • 个人所得税纳税比例
  • 有限合伙企业利润先税后分
  • 填写银行结算凭证的有关印鉴,应集中由谁保管
  • 会计核算不实
  • 设备发票怎么抵扣
  • 税控盘服务费怎么填写申报表
  • 零售环节销售金额标准
  • 小规模纳税人出租房屋增值税税率是多少
  • 进项税额转出怎么申报
  • 餐费报销需要发票吗
  • 专用发票地址写错字了能用吗
  • 企业收到党建经费 所得税
  • 个体户生产经营所得怎么报税
  • win10教育版用户账户控制怎么取消
  • 没有收入业务招待费要全额调增吗
  • 代扣代缴返还的手续费科目
  • 工厂的绿化费进项税额
  • 实收资本账户的核算内容是什么
  • 个人多交社保划不划算
  • PHP:Memcached::quit()的用法_Memcached类
  • php编写
  • kzip_main.exe是什么
  • input输入框限制输入数字范围
  • 企业所得税季初数怎么填
  • thinkphp接收ajax数据
  • 餐饮固定成本怎么算的
  • 证券公司代理发行
  • 工会经费按工资总额的
  • 固定资产融资租赁如何确认入账价值
  • 不走流水开发票可以吗
  • js日期选择
  • mongo groupby
  • 公司认缴出资怎么交税
  • 小规模纳税人起征点变化历程
  • 工会经费的主要用途
  • 公司清算的特征
  • 休产假的工资扣个人所得税吗
  • 企业年度报告填报时间
  • 广告设计要交文化事业建设
  • 房地产按揭贷款放款条件
  • 利息收入记借方还是贷方
  • 公司车还车贷计入什么科目
  • 公司差旅费报销标准表
  • 生产型企业加计扣除10%
  • 母子公司往来款是否涉及交税
  • Mysql中几种插入效率的实例对比
  • docker设置固定ip
  • mac如何强制关机开机
  • mac显示隐藏文件夹
  • os x 10.11 el capitan中文版上手体验评测
  • mac怎么设置屏幕显示时间
  • windows无法访问指定设备路径权限
  • linux常用命令行
  • linux的free命令详解
  • Win10 Mobile 10586.63截图曝光:或为正式推送版本
  • Win10预览版桌面图标和任务栏不翼而飞怎么办?
  • nodejs怎么开发后端
  • 不错的mod_perl编程的简单应用实例介绍
  • 怎么做小地图
  • material design app
  • 批处理替换文件
  • nodejs.
  • android 标签页
  • unity快速接入第三方sdk
  • javaScript parseInt字符转化为数字函数使用小结
  • js知识总结
  • android设计模式的应用场景
  • python作用域和命名空间
  • javascript程序设计教程
  • comparable接口怎么用
  • 国家税务局湖北省税务总局
  • 维修基金交了多少钱怎么查
  • 奔驰购置税多少钱
  • 开票有什么好处吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设