遇到在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中拼接中文参数,后台接收为乱码的问题的更多相关文章

  1. 【JS】中ajax的URL中包含中文,后台接收乱码

    [问题]ajax提交get请求,url中参数包含中文,后台接收到显示乱码. [解决方案]前台: function getSiteInfoByName(siteName){ var res; $.aja ...

  2. get请求url中带有中文参数出现乱码情况

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

  3. js的url中传递中文参数乱码,如何获取url中参数问题

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript ...

  4. Js的Url中传递中文参数乱码的解决

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url& ...

  5. js获取url中的中文参数出现乱码

    解决方法 function getQueryString(key){ var reg = new RegExp("(^|&)"+key+"=([^&]*) ...

  6. url中传递中文参数时的转码与解码

    URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8" ...

  7. [转]asp.net URL中包含中文参数造成乱码的解决方法

    本文转自:http://www.jb51.net/article/22437.htm 问题: 前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:htt ...

  8. GBK 编码时 url 中带中文参数的问题

    项目中遇到的 GBK 编码问题,记录如下. 将代码精简为: <!DOCTYPE HTML> <html> <meta charset="gb2312" ...

  9. JS获取URL传的值与解决获取URL中的中文参数出现乱码

    大家好,我是小C, 我们在项目开发中有时需要页面与页面之间的传值,那我们可能会选择用地址栏传递参数,那另外的那个页面就需要获取地址栏里的参数,今天分享下关于地址栏怎么传递参数与获取中文参数出现乱码的解 ...

随机推荐

  1. jenkins实现git自动拉取代码时替换配置文件

    jenkins实现从git上自动拉取源代码——>自动编译——>发布到测试服务器——>验证测试,这个大家应该都知道,但是关于源代码里的配置文件,可能就会有点头疼了, 一般测试都会自己的 ...

  2. [Linux]centos下安装memcached

    一.yum安装 1.Linux系统安装memcached,首先要先安装libevent库. yum install libevent libevent-devel 2.安装memcached yum ...

  3. TestNG如何用命令行运行

    TestNG如何用命令行运行 调用TestNG最简单的方法事下面的: java org.testng.TestNG testng1.xml 以上是我在网上搜索到的最多的答案,但对于第一次接触testn ...

  4. Linux查看CPU和内存情况

    本文简单介绍在Linux上查看CPU和内存情况和一款系统资源查看工具htop. 查看CPU情况 以下是个人工作会经常使用到的服务器的信息. 查看所有CPU信息 可以通过如下命令查看所有CPU信息: # ...

  5. ES&IK环境搭建

    本来打算docker安装es,和腾讯云上的服务器相比,一台赤裸裸的本地机,甚至连很多基础的指令都没有,还花样各种报错,对于我这种新手来说简直了,百度啊cddn啊终于整出来了,记录一下: 一:安装依赖 ...

  6. IE浏览器远程代码执行高危漏洞(CVE-2019-1367)

    IE浏览器远程代码执行高危漏洞(CVE-2019-1367)加固遇到的问题 一.背景介绍 Internet Explorer,是微软公司推出的一款网页浏览器.用户量极大.9月23日微软紧急发布安全更新 ...

  7. 匿名函数,内置函数II,闭包

    1. 匿名函数 匿名函数,顾名思义就是没有名字的函数,那么什么函数没有名字呢?这个就是我们以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数. 现在有一个需求:你们写一个函数,此函数接收两 ...

  8. netcore3.0使用Session

    首先需要明确一点,netcore使用session不能直接使用,必须引用nuget包并做注册之后才能使用. 例如下面的例子,若未注册session服务会报 HttpContext.Session.Se ...

  9. zabbix 分布式监控及优化

    1..zabbix分布式监控,模拟多机房实现监控? 1.有多机房时,需要用到proxy 1.网络不通 2.网络延迟 2.当监控的主机较多时,也可以用proxy来缓解压力 1.安装proxy [root ...

  10. 测试环境部署之填坑记录-Expected one result (or null) to be returned by selectOne(), but found: 2

    最近在部署性能测试环境的时候,环境 部署好以后,部分功能出现接口查询异常,问题现象: 拿到错误,肯定要先判断是前端还是后端代码的问题,最简单的方式是抓包查看: 以上是报错页面捕获的接口报错,很明显的接 ...