Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >get请求中url传参中文乱码问题–集锦「建议收藏」

get请求中url传参中文乱码问题–集锦「建议收藏」

作者头像
全栈程序员站长
发布于 2022-07-19 06:30:56
发布于 2022-07-19 06:30:56
7.1K0
举报

大家好,又见面了,我是全栈君。

=================================================

在项目中经常会遇到中文传参数,在后台接收到乱码问题。那么在遇到这种情况下我们应该怎么进行处理让我们传到后台接收到的参数不是乱码是我们想要接收的到的,下面就是我的一些认识和理解。

一:get请求url中带有中文参数,有三种方式进行处理防止中文乱码

1、如果使用tomcat作为服务器,那么修改tomcat配置文件conf/server.xml中,在 <Connector port=”8082″ protocol=”HTTP/1.1″ 中加入 URIEncoding=”utf-8″的编码集

2、前台需要对中文参数进行编码,调用js方法encodeURI(url),将url编码,然后请求。

后台接受时,需处理String str = new String(request.getParameter(“param”).getBytes(“iso8859-1″),”UTF-8”);

原因:tomcat不设置编码时,默认是iso8859-1,即tomcat默认会以iso8859-1编码接收get参数。 以上操作是将参数以iso8859-1编码转化为字节数组,然后再以UTF-8将字节数组转化为字符串。

另外需注意在框架的使用中:request.setCharacterEncoding(encoding);只对post请求有效。而且,spring的CharacterEncodingFilter也只是做了request(和response).setCharacterEncoding(encoding);的操作。所以spring的filter配置不作用于get参数接收。

3、解决get请求,后台接受中文参数乱码处理的方法(搜索功能带参数)

(1)前台获取数据,在js中进行编码处理

encodeURI函数采用utf-8进行编码,而在服务器的进行解码时候,默认都不是以uft-8进行解码,所以就会出现乱码。

两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一 次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO- 8859-1编码的效果相同。

(2)后台解码处理

在后台接收参数时候,首先通过request.getParameter()自动进行第一次解码(可能是 gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再使用UTF-8进行第二次解码,通常使用 java.net.URLDecoder(“”,”UTF-8″)方法。

两次编码两次解码的过程为:

UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,所以不会出现乱码。

注:

1:这种两次encodeURI方式不用去知道服务器的解码方式,也可以得到正确的数据。

2:get请求建议尽量不带中文参数,如果使用建议使用两次encodeURI进行编码

3.参考资料 URL编码与两次encodeURI:http://blog.sina.com.cn/s/blog_8af112fd0102vxb7.html

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/121288.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言进阶-回调函数
目录 前言 回调函数 回调型计算器 回调冒泡排序(模拟qsort库函数) qsort函数原型 compar参数 代码演示  冒泡排序(bubble_sort) ---- 前言 ---- 本文主要讲解 回调函数的理解 回调实现计算器 qsort各种功能的使用 冒泡排序各种功能的实现 回调函数 ---- 定义 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针(地址)作为参数传递给另一 个函数, 当这个指针被用来调用其所指向的函数时,我们就说这是回调函数 回调函数不是由该函数的实现
用户9645905
2022/11/30
9680
C语言进阶-回调函数
【指针进阶三】实现C语言快排函数qsort&回调函数
因为cmp比较函数需要使用者自行设计,所以对于不同的使用者在qsort函数里传给cmp函数的参数类型可能是任何类型的指针,所以在cmp比较函数内得用void*类型的指针来接收,使用时只需将void* 类型的指针做出相应的强转即可。
MicroFrank
2023/01/16
5020
【C】指针进阶
这里需要注意,常量字符串“abcdef”时存放在只读数据区中的,可以读取,但不能更改,所以我们使用const来修饰,防止通过p修改字符串 const char ps = “abcdef”;//这里的ps指向的是字符串的首字符 要想修改字符串中的内容需要用到数组:
阿伟@t
2023/10/10
2090
【C】指针进阶
C语言指针深度解剖
指针是C语言的灵魂,深入理解指针,是学好学会C语言的重要前提。因此,本文将重点讲解C语言指针的深度内容。
二肥是只大懒蓝猫
2023/03/30
4870
C语言指针深度解剖
【C语言】进阶指针
例如下面代码,pc就是一个字符指针;"abcdef"是一个常量字符串,不能被修改,pb里面存的是该常量字符串的首字符’ a '的地址。
YoungMLet
2024/03/01
950
【C语言新手村】小怪升级 指针plus版
这里其实就是pa先和“ * ”结合,因为“ [ ] ”他的优先级高于“ * ”
f狐o狸x
2024/11/19
410
【C语言新手村】小怪升级 指针plus版
指针进阶(3)
这段代码可以排序整型数据,我们需要在这段代码的基础上进行改进,使得它可以排序任意类型的数据。
用户10923087
2024/01/23
1180
【C指针进阶】(C精髓)——对指针的更进一步深入剖析(图文近2w详解)
本文承接了上文:初阶指针——全面了解指针,在此基础上对指针进行更深一步的剖析,相信我,也请相信你自己!
诺诺的包包
2023/02/17
5940
【C指针进阶】(C精髓)——对指针的更进一步深入剖析(图文近2w详解)
C语言---深入指针(4)
对于qsort函数来说,我们只需要额外构建一个比较函数就能利用qsort进行快速排列
凯子坚持C
2024/09/23
960
【C语言篇】深入理解指针4(模拟实现qsort函数)
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。
半截诗
2024/10/09
850
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言】手把手带你拿捏指针(4)(含qsort函数详解)
什么是回调函数?    回调函数就是⼀个通过函数指针调用的函数。    如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发⽣时由另外的一方调用的,用于对该事件或条件进行响应    可能这么说着有些抽象,我们还是举一个例子,比如上一篇文章我们讲到的计算器,我们当时为了解决代码冗余,使用了转移表,也就是函数指针数组,那么是否还有其它方法呢?比如我坚持使用Switch语句,而不使用if语句    这个内容就涉及到我们的回调函数,回调函数简单地说就是将函数指针传给另一个函数,通过这个函数来使用传过来的函数    我们可以将之前冗余的部分包装成函数,最大的冗余就是那个Switch语句,我们来看看冗余部分:
TANGLONG
2024/10/15
1030
【C语言】手把手带你拿捏指针(4)(含qsort函数详解)
C语言进阶——指针进阶
指针就是地址,而凡是存储在内存中的值都会有属于自己的地址,指针指向地址,这样我们就能通过指针间接操作变量。我们在指针初阶中介绍了指针的基本概念:如指针大小、野指针问题、指针间的关系运算等,在我们的指针进阶中,将会对指针进行进一步剖析,见识更深的指针!🎊🎊
北 海
2023/07/01
1740
C语言进阶——指针进阶
指针进阶(2)
那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
用户10923087
2024/01/23
990
指针进阶(2)
拿捏指针(三)
在这之前我们学习了《拿捏指针(一)》,《拿捏指针(二)》没看过的可以去看看哟,接下里我们将指针最后一篇,《拿捏指针(三)》,看完直接捏爆指针。
秋邱
2024/10/09
870
拿捏指针(三)
【指针合集】全方位理解C语言指针
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。 所以为了有效的使用内存,就要把内存划分成一个个小的内存单元,每个内存单元的大小都是一个字节。 为了能够有效的访问到内存的每个单元,就要给内存单元进行编号,这些编号被称为内存单元的地址。 在写程序时,创建的变量、数组等都要在内存上开辟空间。 每个内存都有唯一的编号,这个编号也被称为地址 地址 == 编号
Yui_
2024/10/16
2850
【指针合集】全方位理解C语言指针
C语言被指针手撕
这里对第二种使用方法简单介绍一下:虽然我们把常量字符串"hi boy "作为初始值赋给字符指针pstr,但是**实际上pstr只是把这个常量字符串的首地址,即’h’的地址给存储起来了。**后续我们可以用%s的方式打印整个字符串。
始终学不会
2023/03/28
4000
C语言被指针手撕
C语言——I /深入理解指针(四)
回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。
用户11015888
2024/03/11
1130
指针进阶详解
理论上字符串第一个字符被改为w,实际上代码无法正常运行,直接挂掉。所以避免被修改,我们const修饰字符指针,避免其被改。
用户10517932
2023/10/07
2150
指针进阶详解
C语言_指针进阶(下)
数组是一个存放相同类型数据的存储空间, 那把函数的地址存放到一个数组中,那这个数组就叫函数指针数组 提示:以下是代码样例,下面案例可供参考
用户10782096
2023/10/10
1880
C语言_指针进阶(下)
【C语言】指针进阶知识终章
其实这看起来是难以理解的,所以我们可以用typedf(起别名)来简化一下,更加容易认识代码:
平凡的人1
2022/11/15
5090
【C语言】指针进阶知识终章
相关推荐
C语言进阶-回调函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档