遇到在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. [译]Vulkan教程(10)交换链

    [译]Vulkan教程(10)交换链 Vulkan does not have the concept of a "default framebuffer", hence it r ...

  2. SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Security简介 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方 ...

  3. [Spring cloud 一步步实现广告系统] 12. 广告索引介绍

    索引设计介绍 在我们广告系统中,为了我们能更快的拿到我们想要的广告数据,我们需要对广告数据添加类似于数据库index一样的索引结构,分两大类:正向索引和倒排索引. 正向索引 通过唯一键/主键生成与对象 ...

  4. C# 重置IE安全等级

    打开IE设置-安全 dynamic shellObject = Interaction.CreateObject("WScript.Shell", ""); / ...

  5. C#如何判断委托是实例方法还是静态方法

    一. 委托的分类 通过用什么类型的方法来声明为委托,可以分为两类: 1. 委托静态方法:把一个静态方法给委托 2. 委托实例方法:把一个实例对象的成员方法给委托 (这两个名字是博主取的,可能不是很专业 ...

  6. 结对编程项目复盘:带UI的小初高数学学习软件

    实现个人项目时,由于我当时的Java GUI编程基础还比较薄弱,所以我选择通过命令行实现,并将编程开发的重点放到了算法效率上去.没能设计出用户体验更佳的UI成为了我在个人项目阶段最大的遗憾. 在这次结 ...

  7. gor实现线上HTTP流量复制压测引流

    一.使用背景 gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在测试环境和预发布环境重现.只需要在 代理例如nginx入口服务器上执行一个进程,就可 ...

  8. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之八:安装报表扩展及最新更新

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  9. 【转载】Android内存泄漏的8种可能

    Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆的可能,所以写出来的 ...

  10. Sql之for update

    for updateselect * from xxxxxxx where namemc='筛查' for update那是一种行级锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁 ...