url链接传递中文的解决办法

本文介绍了解决Tomcat服务器中文乱码问题的方法,包括修改Tomcat配置文件和后台代码处理两种方式,并提供了URL参数传递时汉字编码的具体解决方案。

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

方法一:修改tomcat配置(不通用)
修改tomcat/conf/server.xml里的
<Connector port="8080" 
               URIEncoding="UTF-8"/>
加入  URIEncoding="UTF-8"属性

方法二:修改后台代码
在取得页面数据之后,比如getParameter之后,
加入:myStr=newString(myStr.getBytes("iso-8859-1"),"utf-8");

注:字符过滤器只能解决post方式提交的中文乱码,不能解决get/url方式,
在加入过滤器的同时再使用以上方法就能解决。但是url通常不要传递汉字,要传递经过
编码后的汉字,使用java.net.Encoder.encode(str,"UTF-8")进行编码再传递,
编码后的汉字可以通过java.net.Decoder.decode(str,"UTF-8")再转回汉字,但是实际测试Decoder无法转换页面获得的汉字,还是建议使用方法二!
注:encode编码后的汉字在chrome和FF浏览器中会自动解析显示成汉字,但是实际传递的仍然是编码字体
IE中显示编码后的字体

但是,又有问题:post提交的数据 getParameter是正常的,但通过 getBytes("iso-8859-1"),"utf-8")后变成了乱码,所有post数据和get数据不一致,必须要在这里做出判断
if(request.getMethod()=="GET"){
name= newString(name.getBytes("iso-8859-1"),"utf-8"); 
}
总结,也就是过滤器+上面那段代码,完美解决get和post的提交中文乱码问题
补充:要在url中传递的汉字首先要经过encodeURI转码,否则还是会出现乱码,
1、如果在java后台使用java.net.Encoder.encode(str,"UTF-8")转后传递到前台url链接再提交
2、如果在前台使用javascritp的编码函数encodeURI(或encodeURIComponent)进行编码再传递
关于javascript的编码函数请见文章:http://blog.sina.com.cn/s/blog_4b5bc0110100zess.html
注:原帖地址 http://blog.sina.com.cn/s/blog_4b5bc0110100z581.html
<think>嗯,用户想解决URL参数传递中文乱码的问题,我需要整理一下解决方案。首先,得知道乱码的原因。URL默认是用ASCII编码的,中文在里面,所以需要转码。常见的编码方式有encodeURI、encodeURIComponent,还有同语言的函数,比如Java的URLEncoder和PHP的urlencode。 然后,用户可能想知道具体的步骤。比如前端怎么处理,后端怎么解码。比如在前端用JavaScript的encodeURI或者encodeURIComponent对参数编码,然后后端用对应的解码方法,比如Java的URLDecoder.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、付费专栏及课程。

余额充值