位置: 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算力思考

  • 魅族18spro处理器是什么(魅族18cpu)

    魅族18spro处理器是什么(魅族18cpu)

  • vivo双引擎闪充在哪里设置(vivo双引擎闪充多少w)

    vivo双引擎闪充在哪里设置(vivo双引擎闪充多少w)

  • 如何查转账给一个人的记录(如何查转账给一个人的记录微信)

    如何查转账给一个人的记录(如何查转账给一个人的记录微信)

  • 宽带无线接入网的分类(无线网络宽带连接)

    宽带无线接入网的分类(无线网络宽带连接)

  • wps为什么不能导出视频(wps为什么不能导入手机相册视频)

    wps为什么不能导出视频(wps为什么不能导入手机相册视频)

  • 经常开热点会损坏手机吗(经常开热点会损耗流量吗)

    经常开热点会损坏手机吗(经常开热点会损耗流量吗)

  • 手机qq视频聊天怎么关闭自己的声音(手机QQ视频聊天怎么设置满屏)

    手机qq视频聊天怎么关闭自己的声音(手机QQ视频聊天怎么设置满屏)

  • 三星m30s有呼吸灯吗(三星s10+设置呼吸灯)

    三星m30s有呼吸灯吗(三星s10+设置呼吸灯)

  • qq昵称查找是什么意思(qq网名查找)

    qq昵称查找是什么意思(qq网名查找)

  • word怎么合并(word怎么合并成一页)

    word怎么合并(word怎么合并成一页)

  • qq忙碌是对个人还是全部(qq忙碌状态会收到消息吗)

    qq忙碌是对个人还是全部(qq忙碌状态会收到消息吗)

  • 快手怎么拍2分钟视频(快手拍5分长视频怎么操作拍)

    快手怎么拍2分钟视频(快手拍5分长视频怎么操作拍)

  • 苹果来电铃声怎么不响(苹果来电铃声怎么换)

    苹果来电铃声怎么不响(苹果来电铃声怎么换)

  • ps图片复制快捷键(ps怎么快捷复制图片)

    ps图片复制快捷键(ps怎么快捷复制图片)

  • ps如何镜像翻转(ps如何镜像翻转身份证)

    ps如何镜像翻转(ps如何镜像翻转身份证)

  • ps如何调整图片大小(ps如何调整图片亮度)

    ps如何调整图片大小(ps如何调整图片亮度)

  • 如何提取目录wps(如何提取目录放在旁边)

    如何提取目录wps(如何提取目录放在旁边)

  • soul能看到访客吗(soul有个访客记录突然没了)

    soul能看到访客吗(soul有个访客记录突然没了)

  • ipad pro 快速截图(ipad pro快速截屏)

    ipad pro 快速截图(ipad pro快速截屏)

  • iphone8手机自己横屏(苹果8时不时自动关机)

    iphone8手机自己横屏(苹果8时不时自动关机)

  • 小米8是快充吗(小米8是快充吗还是慢充)

    小米8是快充吗(小米8是快充吗还是慢充)

  • 探探左划是什么意思(探探左边滑是什么意思)

    探探左划是什么意思(探探左边滑是什么意思)

  • ipad专业视频剪辑软件(ipad2021剪视频)

    ipad专业视频剪辑软件(ipad2021剪视频)

  • gn8001是金立什么型号(金立gn800是什么型号)

    gn8001是金立什么型号(金立gn800是什么型号)

  • 为什么看抖音总是卡(为什么看抖音总是觉得那个人就是我)

    为什么看抖音总是卡(为什么看抖音总是觉得那个人就是我)

  • 什么是真无线(什么是真无线蓝牙耳机主动降噪)

    什么是真无线(什么是真无线蓝牙耳机主动降噪)

  • rsync命令  远程数据同步工具(rsync连接)

    rsync命令 远程数据同步工具(rsync连接)

  • 个人代开资金占用费,如何计算代扣代缴个税
  • 建筑业资源税如何缴纳
  • 小规模房地产企业税收优惠政策
  • 应付销售方代垫的运费计入什么科目
  • 发票专用章和财务章区别
  • 普通发票被作废的话财务会发现吗
  • 劳务公司临时工工资需要申报吗
  • 私立医院申报程序
  • 运输企业车辆折旧一次性折旧
  • 资产负债表的其他应付款怎么填列
  • 开具3%增值税发票
  • 应付账款的核算会计分录
  • 退货的增值税专用发票
  • 收到补助款的会计分录
  • 福利企业退税的资金去处
  • 租的厂房再转租怎么开票抵扣
  • 股息率炒股
  • 银行直接扣的手续费怎么记账
  • 计提汇算清缴涉及到不是当年费用怎么记账
  • 刷单的费用计入劳务费吗
  • 公司买手机给员工怎么做账
  • 网页老是自己跳出来
  • 联想Lenovo ThinkPad X13 Gen1
  • 广告制作包括印花吗
  • php有很多流行的mvc框架,这些框架可以
  • win10打印机驱动在电脑哪里找
  • 印花税计提与缴税的区别
  • 贷款的资产减值怎么处理
  • PQIBrowser.exe是什么进程 PQIBrowser进程查询
  • php://filter协议
  • 附有退回条件的销售商
  • 辞退员工补偿标准是n+1还是2n
  • PHP:imagefontwidth()的用法_GD库图像处理函数
  • uni-app 怎么实现页面不跳转依旧可以传数据
  • framework core
  • 持续集成的步骤
  • Stable Diffusion 关键词tag语法教程
  • 为什么我的命令提示符里显示user
  • 用php编写一个简单的计算器程序
  • ps抠图之后怎么拿出来
  • 季度是指
  • 公司注册完成以后需要做哪些事情
  • 会计备案报送期间
  • 当月认证的发票可以撤销吗
  • mysql复制表结构及数据
  • 出口退税中的免税是什么
  • 厂区绿化工程计入什么科目
  • 企业银行基本户和一般户的区别
  • 政府会计制度下基建账
  • 个体户没有税务登记怎么开发票
  • 市场开发费用会计分录
  • 外埠存款会计分录怎么写
  • 工会经费的计提比例
  • 资产减值损失属于损益类的收入还是费用
  • 水利税费会计分录
  • 生产成本里面的直接人工
  • 投资款项是什么意思
  • 折现率算现值公式
  • 企业分红给个人的税收
  • 财务报表项目认定有哪些
  • 去大城市发展成功的例子
  • mac怎么移动鼠标
  • win10打开此电脑的快捷键
  • 重装win7系统后没有无线网
  • win8.1删除所有内容并重新安装
  • centos ssh升级
  • 系统时间错乱如何使用NTP进行系统时间调整
  • ajax分页查询数据文档效果图
  • Cocos2dx CCLabelAtlas字体与CCLabelTTF字体的使用方法
  • android PercentRelativeLayout 支持百分比来设置控件的宽高
  • 注释标签的内容会显示在浏览器窗口中
  • 深入了解是啥意思
  • 网页过关类游戏
  • jquery 设置css
  • Python使用dis模块把Python反编译为字节码的用法详解
  • 未按时缴纳税款是什么行为
  • 关注龙江医保
  • 建筑一般纳税人开3%
  • 江苏单位医保如何查询
  • 煤矸石征收资源税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设