请求参数中文乱码问题(GET)

同样的我们要解决GET方式下的请求参数中文乱码问题,那么我们首先要知道GET请求方式之下为什么中文数据就会出现乱码?

因为我们GET方式之下的请求参数是在请求行中,是紧接着跟到URL的后面, 但是我们要知道我们传输数据的时候通过HTTP协议发送到服务器端中, 那么我们的HTTP协议中是不支持中文数据的发送的, 所以我们肯定是要采用某种编码的形式进行一个数据的发送, 由于我们的GET方式的请求数据是封装到我们的请求行的URL后面的, 所以我们一般发送Get方式的请求数据的时候我们如果请求参数中有中文数据, 这个时候我们都是将我们的中文数据转换为URL编码的格式, 然后对数据进行一个发送, 将这个URL编码发送给服务器端之后我们的服务器端再解析这个URL编码即可

  • 但是这个时候我们的乱码问题就出现在浏览器的URL编码和tomcat服务器的URL解码上了,我们浏览器将我们的请求参数编码为URL编码的时候采用的字符集就是我们的前端HTML界面使用的字符集, 我们一般都是为UTF-8字符集 , 但是我们的tomcat服务器解码的时候使用到的是ISO-8859-1编码对我们的URL编码进行一个解码, 这个时候肯定是会出现一个乱码问题

那么这个时候我们要如何解决这个乱码问题?

其实如果可以的话我们最简单的解决这个乱码的问题的方式应该是我们既然是使用的UTF-8编码字符集完成的URL编码, 那么我们直接将我们的解码URL的时候的编码也设置为UTF-8编码即可, 但是这个时候对应的会有一些问题的出现, 我们Tomcat服务器对URL进行解码的时候内置的就设置了我们的解码的时候就是使用我们的ISO-8859-1编码, 所以没有给我们提供一个可以设置tomcat服务器对这个URL解码的时候的字符集 — > 所以我们说这种方式就是行不通的

那么我们到底要如何解决?

首先我们要知道, 我们不管是使用UTF-8字符集进行的编码也罢, 或者我们使用的ISO-8859-1字符集解码也罢, 我们其实中间的URL编码都是同一个编码, 我们只不过是对应的将我们的中文数据通过使用UTF-8的编码编码成了对应的编码数据 ,假如这个中文数据到我们的UTF-8字符集中的编码是10000, 这个时候我们编码之后那么自然就拿到了10000这个数据, 但是由于我们的ISO-8859-1字符集中的10000是对应的其他的字符, 所以这个时候产生了乱码 ----> 那么这个时候我们只需要是拿到这个乱码之后的字符我们使用ISO-8859-1字符集对这个乱码后的数据进行一个getBytes()操作, 那么我们就拿到了这个乱码的数据的底层编码, 那么我们其实就是相当于拿到了10000, 然后我们拿到了这个10000之后我们只需要使用UTF-8编码对其进行一个解码就可以了, 就可以获取到没有乱码的正确的中文数据了 — > 这个时候由于10000其实就是对应的UTF-8字符集中的对应此时的中文数据的编码, 那么我们通过这个10000进行一个UTF-8编码字符集下的解码操作, 最终肯定就会得到没有乱码的中文数据

GET请求之下乱码问题的发生以及我们的乱码问题如何解决(图解):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uyoz2r81-1655913538425)(E:\非凡英才\JavaWeb开发\Servlet\图解\GET方式的请求参数又中文的乱码问题以及解决.png)]

我们实际如何使用代码解决的演示:

package com.ffyc.servicedemo;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;public class Demo {public static void main(String[] args) throws UnsupportedEncodingException {//假设我们的GET请求参数中的中文数据值就是"张三"String s = "张三";//对这个中文数据进行UTF-8字符集下的URL编码String encode = URLEncoder.encode(s, "utf-8"); //这一步就是模拟我们浏览器对我们的中文数据使用UTF-8字符集进行一个编码System.out.println(encode); //输出编码, 我们可以看一下这个URL中文编码的格式//对上面我们获得的URL中文编码进行一个ISO-8859-1编码字符集之下的URL解码String decode = URLDecoder.decode(encode,"iso-8859-1"); //这一步就是模拟我们1Tomcat服务器对我们的使用UTF-8字符集编码的URL再使用ISO-8859-1字符集进行一个解码, 这个时候就会得到乱码后的数据System.out.println(decode); //我们将乱码后的数据也打印出来看一下byte[] bytes = decode.getBytes(StandardCharsets.ISO_8859_1); //使用ISO-8859-1字符集对我们的数据进行一个编码操作String fin = new String(bytes,StandardCharsets.UTF_8); //使用UTF-8字符集对我们的数据进行一个解码操作, 解码之后就得到了我们正确的中文数据, 此时为"张三"System.out.println(fin);}
}

我们的Java中为我们提供了两个类专门用于URL的编码和解码:

①URL编码API: URLEncoder类

  • 调用其中的encode()静态方法

②URL解码API: URLDecoder类

  • 调用其中的decoder()静态方法

总结:

中文乱码问题的解决方案:

POST: 设置流的编码

req.setCharacterEncoding(“UTF-8”);

GET: 先编码再解码

new String( username.getBytes(“ISO-8859-1”) , “UTF-8” )

  • 注意: 使用先编码再解码的方式是一种通用的方式, 也就是对于我们的POST方式的请求参数乱码的问题我们也是可以使用先编码再解码的方式来解决

补充:

上面的StandardCharsets.UTF_8和StandardCharsets.IOS_8859_1是两个常量, 就是分别表示"UTF-8" 和 “ISO-8859-1”

  • StandardCharsets是jdk自带的字符编码常量字段
这里我们给出StandardCharsets类的源代码: (注意: 这个类是一个final关键字修饰的类, 不能被继承 ):
public final class StandardCharsets {private StandardCharsets() {throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");}/*** Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the* Unicode character set*/public static final Charset US_ASCII = Charset.forName("US-ASCII");/*** ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1*/public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");/*** Eight-bit UCS Transformation Format*/public static final Charset UTF_8 = Charset.forName("UTF-8");/*** Sixteen-bit UCS Transformation Format, big-endian byte order*/public static final Charset UTF_16BE = Charset.forName("UTF-16BE");/*** Sixteen-bit UCS Transformation Format, little-endian byte order*/public static final Charset UTF_16LE = Charset.forName("UTF-16LE");/*** Sixteen-bit UCS Transformation Format, byte order identified by an* optional byte-order mark*/public static final Charset UTF_16 = Charset.forName("UTF-16");
}

补充二:

Tomcat8.0之后已经将GET方式的请求参数乱码问题解决了, 解决的方式就是默认解码URL的字符集不再是ISO-8859-1,而是UTF-8了

补充三:

对于get方式的请求参数是在请求行中, 对于请求行中的如果有中文数据的时候就会出现乱码的情况, 因为请求行中的数据如果是中文默认我们就是会进行一个URL编码, 对于英文是直接传输, 对于特殊符号也要进行一个编码, 其实就是使用另一种符号来表示特殊符号(比如使用+(加号)表示空格)

get方式的请求参数是在请求行中, 默认就是使用URL形式的编码, 但是对于英文数据都是兼容的, 但是对于中文数据就要使用URL编码,浏览器会对get方式的请求参数中的中文进行一个默认的URL的编码, 服务器会对get方式的请求参数中的中文进行一个默认的URL解码

Cookie存储的数据是以响应头的形式返回到客户端的, 响应头中不是使用的URL编码, 但是由于我们的HTTP协议中都是不支持中文数据的传输的, 所以即使是Cookie中存储的中文数据我们也要进行一个编码, 编码为URL也是可以, 编码为utf-8也可以, 只要是编码为ACSII中的字符就可以

补充四:

注意: 在服务器中只要是使用流获取或者发送的数据进行前后端交互的时候我们都要设置对应的流的编码字符集为utf-8, 因为我们的tomcat服务器中对于流的编码默认还是ISO-8859-1

  • 比如:

    1. get方式响应数据时
    2. post方式请求数据时
    3. post方式响应数据时

GET方式请求参数中文乱码问题 [JavaWeb][Servlet]相关推荐

  1. HttpClient4.x中GET方式发送请求参数中文乱码处理

    HttpClient4.x GET 方式发送请求参数中文乱码处理 (非返回结果乱码) 之前尝试对HttpGet对象添加头部字符编码设置均无效,后改用参数字符编码处理后实现请求参数乱码正确处理. Htt ...

  2. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)

    前述: 在写这篇笔记之前,对笔记中的设计模式进行介绍: 本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式 (1)装饰(包装)设计模式口诀: ①定义一个类,实现被装饰对象的接口 ②定义一个成员变量 ...

  3. 前端请求参数中文乱码问题

    1.以post方式提交 以post方式提交的请求参数中文乱码问题可以通过后端的编码过滤器解决. 可以直接使用springMVC中的编码过滤器,只需在web.xml中添加过滤器的配置即可. <fi ...

  4. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器

    文章目录 ​ SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...

  5. Request_获取请求参数中文乱码问题处理

    * 中文乱码问题:                 * get方式:tomcat 8 已经将get方式乱码问题解决了                 * post方式:会乱码              ...

  6. request请求参数中文乱码问题

    中文乱码问题解决方案 编码格式不同导致 浏览器填写的是ISO 代码接收的是:utf-8 POST方式修改: POST方式修改: 底层通过getReader() 流的方式获取资源. 只需要setChar ...

  7. [javaweb] servlet处理请求参数中文乱码的问题

    对于post请求方式: 在获取参数代码之前加上下面这一句代码就可以 request.setCharacterEncoding("UTF-8"); 不然的话中文就是乱码

  8. 解决: VUE 项目中表单提交中文乱码、接口请求参数中文乱码

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 表单提交出现乱码: 接口请求乱码同于上图. 2. 解决: 在出现乱码的内容外面加函数:deco ...

  9. store请求参数中文乱码问题解决

    给combobox增加输入字符模糊匹配功能,发现后台收到的keyword居然是乱码,查看请求头发现store发起的是GET请求且没有 设置Content-Type,那就难怪了.没有时间去纠结如何给st ...

最新文章

  1. python教程视频在线-微软再推免费在线Python教程 包含20个视频
  2. mysql单列去重复group by分组取每组前几条记录加order by排序
  3. 如何调度spark程序_如何定时,周期性的运行程序?Python APScheduler实现任务灵活调度...
  4. POJ-1062-昂贵的聘礼 (最短路)
  5. 每个计算机主机有且只能有一块硬盘对不对,电子科技大学计算机基础试卷.doc...
  6. 云架构指挥调度平台技术方案建议书
  7. 自学python书籍怎么选-学习Python可以看书籍学习吗?老男孩Python入门课程
  8. Python之网络编程(一)
  9. Easyui--官网
  10. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)
  11. python:在指定范围内按学号随机生成座位顺序,并分行输出
  12. 自己交社保的人怎么样才知道自己可以退休了?
  13. 计算机二级msoffice选择题知识,2017计算机二级MSoffice选择题练习(含答案)
  14. PHP 登录TPlink路由器
  15. 采用简化原型法进行软件项目需求分析
  16. GAP软件的使用(20150514、20151002、20151004、20151012)
  17. Eclipse仿Visual AssistX 编辑着色插件
  18. OC 7141采用 SOT-23-5 封装,电源电压: 2.5V~6V,线性降压恒流驱动器
  19. “量化之神”西蒙斯退位,解密金融模型和量化投资帝国
  20. matlab的length是什么,大家好!matlab中length是什么意思?,matlab中的length表示什么?应该如何使用?...

热门文章

  1. [转]敏捷十年简史回顾——影响敏捷开发历程的27件事
  2. Medical Data for Machine Learning
  3. android手势解锁说明
  4. 模糊+滑膜轨迹跟踪控制算法 算法可实现功能:跟踪双移线,单移线,多项式曲线等多种轨迹,稳定性和较好
  5. 毕业设计——>基于SSM的健身房管理系统(带数据库,本管理系统下载链接地址)
  6. go gin使用h2c
  7. C++_指针和引用的区别
  8. [Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算
  9. Latex使用algorithm2e包生成伪代码 跨栏、换行方法。
  10. 如何快速把一个11g数据库插入到12c cdb中去?