遇到在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. 反转字符串中的单词 III

    给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest"输出: &qu ...

  2. volatile可见性案例-黑马

    volatile可见性案例-黑马 package com.mozq.demo.demo; class Task implements Runnable{ //public boolean flag = ...

  3. js里面的键盘事件对应的码值

    键盘事件对应的码值keyCode 8 = BackSpace BackSpacekeyCode 9 = Tab TabkeyCode 12 = ClearkeyCode 13 = EnterkeyCo ...

  4. 第一章 1.1 计算机和Python基础

    一.计算机基础 1.1.进制 计算机中的数字有四种存在形式,分别是:十进制.二进制.八进制和十六进制 1.1.1.十进制 1.基数:0-9 2.进位:逢10进1 3.位权:例:123 = 3*10^0 ...

  5. js 生成32位随机数,可用于微信支付流水号(前端生成)

    $(function () { /*生成32位随机流水号*/ /*默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1*/ var $chars = 'ABCDEFGHJKMNPQRSTWXYZ ...

  6. ASP.NET Core 2.2 WebApi 系列【七】泛型仓储模式和工作单元

    在之前的泛型仓储模式实现中,每个增删改都调用了SaveChanges方法,导致每次更新都提交了事务. 在实际开发过程中,我们经常遇到同时操作多张表数据,那么按照之前的写法,对数据库提交了多次操作,开启 ...

  7. CSS 从大图中选取部分区域作为目标图标

    从大图中选取部分区域作为目标图标 by:授客 QQ:1033553122 1.图片素材 图片素材如下(大小:137px * 264px),图中从上到下,连续存放了两张100px * 100px的图   ...

  8. JS基础语法---arguments对象伪数组

    引入: //计算两个数字的和 function f1(x, y) { return x + y; } //计算三个数字的和 function f2(x, y, z) { return x + y + ...

  9. Linux 和 Windows 查看 CUDA 和 cuDNN 版本

    目录 Linux 查看 CUDA 版本 查看 cuDNN 版本 Windows 查看 CUDA 版本 查看 cuDNN 版本 References Linux 查看 CUDA 版本 方法一: nvcc ...

  10. 安装pymssql

    直接安装失败 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql 去下载对应的 pymssql   whl版本 之后 pip install whe ...