浏览器自动将参数中的url转码问题

本文详细解析了URL中特殊字符的编码与解码过程,对比了escape、encodeURI及encodeURIComponent三种编码方式的区别,并提供了实际应用案例,帮助读者理解如何正确处理URL中的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到一个问题,

开始的url如下:

http://localhost:6666/pages/wxpay.html? code_url=weixin://wxpay/biz

请求转发到谷歌浏览器打开后变成了

http://localhost:6666/pages/wxpay.html? code_url=weixin:%2F%2Fwxpay%2Fbizpayurl%3Fpr%3

也就是说,url中的参数code_url参数中的带有“//”被浏览器进行了编码

所以重新获取的时候,需要重新进行解码后才是原来的形式。

 

参考博客:

https://www.cnblogs.com/z-one/p/6542955.html

 

js对url进行编码和解码(三种方式区别)
*** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不经过编码直接用于 URL。

***例如:搜索的中文关键字,复制网址之后再粘贴就会发现该URL已经被转码。

1、escape 和 unescape

原理:对除ASCII字母、数字、标点符号 @  *  _  +  -  .  / 以外的其他字符进行编码。

编码:escape('http://www.baidu.com?name=zhang@xiao@jie&order=1')

   结果:"http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1"

   escape('张')

   结果:"%u5F20"

解码:unescape("http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1")

   结果:"http://www.baidu.com?name=zhang@xiao@jie&order=1"

   unescape("%u5F20")

   结果:"张"

2、encodeURI 和 decodeURI

原理:返回编码为有效的统一资源标识符 (URI) 的字符串,不会被编码的字符:! @ # $ & * ( ) = : / ; ? + '

     encodeURI()是Javascript中真正用来对URL编码的函数。

编码:encodeURI('http://www.baidu.com?name=zhang@xiao@jie&order=1')

   结果:"http://www.baidu.com?name=zhang@xiao@jie&order=1"

解码:decodeURI("http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1")

   结果:"http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1"

3、encodeURIComponent 和 decodeURIComponent

原理:对URL的组成部分进行个别编码,而不用于对整个URL进行编码

编码:encodeURIComponent('http://www.baidu.com?name=zhang@xiao@jie&order=1')
   结果:"http%3A%2F%2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1"

解码:decodeURIComponent("http%3A%2F%2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1")

   "http://www.baidu.com?name=zhang@xiao@jie&order=1"

  

转载于:https://www.cnblogs.com/Andrew520/p/10973795.html

<think>嗯,用户想解决URL参数传递中文乱码的问题,我需要整理一下解决方案。首先,得知道乱码的原因。URL默认是用ASCII编码的,中文不在里面,所以需要转码。常见的编码方式有encodeURI、encodeURIComponent,还有不同语言的函数,比如JavaURLEncoder和PHP的urlencode。 然后,用户可能想知道具体的步骤。比如前端怎么处理,后端怎么解码。比如在前端用JavaScript的encodeURI或者encodeURIComponent对参数编码,然后后端用对应的解码方法,比如JavaURLDecoder.decode。不过要注意,有时候可能需要双重编码,特别是当服务器自动解码一次的时候,比如用两次encodeURI,后端再解码两次。 另外,不同的编程语言处理方式不一样,用户可能用了Java、PHP或者其他后端语言,需要分别说明。比如PHP用urlencode和urldecode,Java的话需要设置字符集,或者用Base64编码,像用户提供的引用4里提到的那样。 还有,可能需要考虑GET和POST方法的区别,以及浏览器自动编码的情况。比如通过链接直接带中文参数浏览器不会自动编码,这时候必须手动处理。而表单提交的话,浏览器通常会帮忙编码。 安全方面,用户可能还关心URL暴露参数问题,比如用Base64编码不仅解决乱码,还能隐藏参数内容,但得注意Base64不是加密,只是编码。 还要注意服务器配置,比如Tomcat的URIEncoding设置,确保服务器用UTF-8解码。不然即使前端正确编码,后端解码还是乱码。 总结起来,步骤大概是:前端编码,后端解码,统一使用UTF-8,处理特殊情况可能需要双重编码或Base64。然后分语言举例,让用户能根据自己用的技术找到对应方法。</think>### 防止URL参数传递中文乱码的解决方案 #### 1. **URL编码的基本原理** URL规范要求参数值必须使用ASCII字符集。中文字符需通过编码转换为`%`后跟十六进制值的格式(如`%E4%B8%AD`表示“中”)。编码方式需前后端统一(通常为UTF-8)[^1][^2][^3]。 #### 2. **前端编码方案** - **JavaScript** 使用`encodeURI()`或`encodeURIComponent()`对参数编码: ```javascript var param = encodeURIComponent("中文参数"); // 输出类似%E4%B8%AD%E6%96%87 ``` 若服务器自动解码一次,可采用双重编码: ```javascript var param = encodeURIComponent(encodeURIComponent("中文参数")); // 后端需双重解码[^5] ``` - **JSP/HTML** 通过链接传递参数时手动编码: ```html <a href="page.jsp?name=<%=URLEncoder.encode("中文", "UTF-8")%>">链接</a> ``` #### 3. **后端解码方案** - **Java** 使用`URLDecoder.decode()`解码,并指定字符集: ```java String name = URLDecoder.decode(request.getParameter("name"), "UTF-8"); ``` 若前端双重编码,需双重解码: ```java String name = URLDecoder.decode(URLDecoder.decode(encodedParam, "UTF-8"), "UTF-8"); ``` - **PHP** 通过`urldecode()`函数处理: ```php $name = urldecode($_GET['name']); ``` - **通用配置** 确保服务器字符集为UTF-8(如Tomcat配置`URIEncoding="UTF-8"`)[^4]。 #### 4. **进阶安全方案** 使用**Base64编码**隐藏参数并避免乱码: ```javascript // 前端编码 var encodedUrl = btoa(unescape(encodeURIComponent("中文参数"))); // 后端解码(Java) String decodedStr = new String(Base64.getDecoder().decode(encodedStr), StandardCharsets.UTF_8); ``` 此方法需前后端约定编解码逻辑,适用于敏感参数传递[^4]。 #### 5. **常见问题排查** - **编码不一致**:前端使用UTF-8编码,后端却用GBK解码会导致乱码。 - **自动解码干扰**:某些框架(如Spring MVC)可能自动解码一次,需配置`@RequestParam`或过滤器处理。 - **特殊字符处理**:`encodeURIComponent()`会编码`/`、`?`等符号,若需保留原始URL结构,需谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值