url中拼接中文参数,后台接收为乱码的问题
遇到在URL中拼接中文的参数,后台拿到的数据为乱码的问题,这里来说一下问题出现的原因与解决方法。
大家比较关心的应该是解决的方法,因此先说解决方法。
解决方法
解决的方法是在客户端对这个中文参数进行编码,然后服务端再进行响应的解码就行了。
客户端编码(JavaScript)
var url = "contract!select.action?chineseParam=" + encodeURI(encodeURI("我是中文参数"));
注意:编码的时候需要使用两次encodeURI()方法,写一个的后台输出是???号,写两个的后台输出则是%4d%5a这种,原因后面再说。
服务端解码(Java)
String chineseParam = java.net.URLDecoder.decode(chineseParam, "UTF-8");
这样就能实现中文参数的前后端传递了。
另外要注意的是,这种解决方法只有在拼接URL参数的场景下有效,如果是将参数传递放在请求体中,比如AJAX中的data,是不需要对中文参数进行手动编码和解码操作的,只需要保证前后端的编码配置一致即可。
乱码的产生原因与乱码的简单解析
聪明的你可能会发现,大多数的中文乱码是通过GET方式产生的。这是因为GET方式有自动解码的操作,相当于执行代码:
URLDecoder.decode("%E6%B1%89%E5%AD%97", "编码方式");
这是产生乱码的根本原因。
Tomcat中乱码产生的原因以及解决方法
在Tomcat的配置文件server.xml中,如果不配置解码方式的话,就会按照默认的ISO-8859-1编码进行解码,具体可以参照Tomcat的文档。
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
这也就意味着服务端会默认执行这样的代码:
URLDecoder.decode("%E6%B1%89%E5%AD%97", "ISO-8859-1");
因为浏览器通常是使用的UTF-8编码,如果使用ISO解码的话,就会出现乱码。其中,【%E6%B1%89%E5%AD%97】是前端encodeURI("汉字") 的结果,此函数使用UTF-8编码。
所以,Tomcat应该在配置文件中增加【URIEncoding="UTF-8"】的配置,避免乱码的问题产生。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
乱码时的问号?
前端处理汉字时用的encodeURI是按照UTF-8方式进行编码,而此种编码方式是一个汉字占3字节。而通过request取到的参数默认是通过ISO-8859-1的方式进行解码的,在编码表中找不到对应的字符就显示【?】了,并且是3倍于汉字的个数,即3个【?】号代表一个汉字。
为什么通过两次encodeURI可以解决乱码问题
回到最上面的解决方法。
将【汉字】通过encodeURI或者encodeURIComponent编码一次,会得到字符串【%E6%B1%89%E5%AD%97】(6个字节),此字符串使用UTF-8编码的,如果此时用ISO-8859-1解码,因为在ISO-8859-1的编码表中找不到【E6】等字段对应的字符,所以是6个问号。
而第二次编码则相当于对非中文字符【%E6%B1%89%E5%AD%97】进行编码,得到的是字符串【%25E6%25B1%2589%25E5%25AD%2597】,此时服务端无论采用哪种解码方式,都将得到【%E6%B1%89%E5%AD%97】字符,就可以被正确解析了。这样,最后再通过UTF-8解码该字符,就可以得到【汉字】了,相当于执行了以下代码:
URLDecoder.decode("%E6%B1%89%E5%AD%97", "UTF-8");
所以通过两次encodeURI就可以解决大部分的乱码问题。
"人生最遗憾的,莫过于轻易地放弃了不该放弃的,却固执地坚持了不该坚持的。"
url中拼接中文参数,后台接收为乱码的问题的更多相关文章
- 【JS】中ajax的URL中包含中文,后台接收乱码
[问题]ajax提交get请求,url中参数包含中文,后台接收到显示乱码. [解决方案]前台: function getSiteInfoByName(siteName){ var res; $.aja ...
- get请求url中带有中文参数出现乱码情况
在项目中经常会遇到中文传参数,在后台接收到乱码问题.那么在遇到这种情况下我们应该怎么进行处理让我们传到后台接收到的参数不是乱码是我们想要接收的到的,下面就是我的一些认识和理解. get请求url中带有 ...
- js的url中传递中文参数乱码,如何获取url中参数问题
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript ...
- Js的Url中传递中文参数乱码的解决
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url& ...
- js获取url中的中文参数出现乱码
解决方法 function getQueryString(key){ var reg = new RegExp("(^|&)"+key+"=([^&]*) ...
- url中传递中文参数时的转码与解码
URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8" ...
- [转]asp.net URL中包含中文参数造成乱码的解决方法
本文转自:http://www.jb51.net/article/22437.htm 问题: 前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:htt ...
- GBK 编码时 url 中带中文参数的问题
项目中遇到的 GBK 编码问题,记录如下. 将代码精简为: <!DOCTYPE HTML> <html> <meta charset="gb2312" ...
- JS获取URL传的值与解决获取URL中的中文参数出现乱码
大家好,我是小C, 我们在项目开发中有时需要页面与页面之间的传值,那我们可能会选择用地址栏传递参数,那另外的那个页面就需要获取地址栏里的参数,今天分享下关于地址栏怎么传递参数与获取中文参数出现乱码的解 ...
随机推荐
- nginx(4)
目录 一.安装配置 1.安装 2.配置文件 3.测试和启动 二.功能 1.虚拟主机 1.1 基于IP 1.2 基于域名 1.3 基于端口 2.访问控制 3.用户认证 4.文件共享 5.文件别名 6.状 ...
- 5G技术发展迅猛,亚博电竞(yabo055)搭上科技快车
要说当前互联网科技最为令人期待的当属yabo055点康母的5G技术了.自2018年5G标准确定以来,民众就对5G非常的期待,而亚博电竞早已意识到了5G时代的来临势不可挡,早已着手将5G运用于网站和游戏 ...
- jxl.jar下载
jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的. 在网上找了很多,不是链接失效,就是csdn上要钱的,所以干脆上传个到自己的博客文件里,方便你们下载. 下载地址: ...
- vue定义全局date过滤器(自定义JS文件模块和Moment.js库)
自定义dateFormat.js文件模块 dateFormat.js /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-0 ...
- ccf-csp201909题解
目录 ccf-csp201909题解 1. 201909-1 小明种苹果 题目描述 解析 通过代码 2. 201909-2 小明种苹果(续) 题目描述 解析 通过代码 3. 201909-3 字符画 ...
- C语言程序设计100例之(15):除法算式
例15 除法算式 问题描述 输入正整数n(2≤n≤68),按从小到大输出所有形如abcde/fghi=n的表达式.其中a~i为1~9的一个排列. 输入格式 每行为一个正整数n (n <= 1 ...
- Web安全测试学习笔记-DVWA-登录密码爆破(使用Burp Suite)
密码爆破简单来说,就是使用密码本(记录了若干密码),用工具(手工也可以,if you like...)一条条读取密码本中的密码后发送登录请求,遍历密码本的过程中可能试出真正的密码. 本文学习在已知登录 ...
- Deepnude算法“tuo”衣服
PS:我不是偷窥狂.我是技术的爱好者 换脸视频后AI又出偏门应用:用算法“tuo”女性衣服 据美国科技媒体Motherboard报道,一名程序员最近开发出一款名叫DeepNude的应用,只要给Deep ...
- C#Winform窗体利用单例子窗体传值父窗体
简述:最近在做C#和HALCON编程,要用到单例的参数由子窗体改变父窗体的值.此例为简化版 1,点击系统设置 2,弹出子窗体,在其输入修改参数后点修改按钮 3,点击确定按钮后,关闭子窗体后,主窗体te ...
- 需要知道的jQuery对象和DOM对象之间的转换
jQuery对象和DOM对象之间的转换 jQuery对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象和DOM对象不能互相调用对方的方法或属性,但它们之间可以进行转换. 两者都无法 ...