当前位置: 代码迷 >> Web前端 >> 处理URL参数中包含有中文参数URL字符串有关问题
  详细解决方案

处理URL参数中包含有中文参数URL字符串有关问题

热度:148   发布时间:2013-10-27 15:21:49.0
处理URL参数中包含有中文参数URL字符串问题

? ? ? ?当URL参数中含有URL字符串的时候,而该字符串还包含有中文,这个时候处理起来会比较恶心,通过yi一段时间摸索,发现可以用base64来解决这个问题:

背景:由于需要请求目标应用不支持JSONP,需要使用另外一个应用做一个中转。客户端是UTF-8编码,作为中转的应用是GBK编码,需要请求的目标应用又是需要UTF-8编码;

?

常规的思路是:

前台传输来的相应编码的URL,后台就用该编码的解码,URLDecoder.decode(params,"encodeType");

但是一般的MVC框架或者应用服务器,在绑定参数的过程中都解码了一次,前台如果想要让后端按照指定编码格式手动解码,需要encodeURIComponent两遍,第一遍框架或应用服务器解码,第二遍自己手动解码

但是这里出现的问题不常规,使用常规方式又比较麻烦,所以采取比较猥琐的方式

例如:如果想要发送这样一个请求

http://localhost/mobile/getInfo.json?url=http://localhost2/mobile/getSomething.json?params=测试

前台Javascript:

var urlEncoded = Base64.encode(encodeURI(url));
//用base64来编码,encodeURI也将中文字符和其他一些字符给一并处理了
//Then, ...使用Ajax发送请求

? ??这里用到了一个Base64 Javascript库,地址:https://github.com/dankogai/js-base64

? ?

Java端的话,使用base64解码之后就得到了encodeURI之后的URI了,直接使用HTTPClient来发送请求

?

import org.apache.commons.codec.binary.Base64;
//推荐使用commons-codec包,不要使用sun.misc.base64decoder

String urlRaw = request.getParameter("url");
String url = new String(Base64.decodeBase64(urlRaw.getBytes()));

//Then, 就可以使用HTTPClient来请求数据
//....
1 楼 m635674608 2013-09-27  
URLdecode也可以解决啊
2 楼 lv12312 2013-09-27  
m635674608 写道
URLdecode也可以解决啊
我开始也是这么思考的,用encodeURIComponent弄两遍,然后传到后台URLDecode解码,解出来的是GBK编码,而需要请求的应用又是UTF-8的,又要转码,太麻烦了;所以用了这种非常规的思维
3 楼 m635674608 2013-09-27  
URLDecode解码,解出来的是GBK编码??? 不是吧??
4 楼 lv12312 2013-09-27  
m635674608 写道
URLDecode解码,解出来的是GBK编码??? 不是吧??
我的意思不是这个,URLDecode是随便可以按照任何编码格式解码的,不限定是GBK,这是我应用中这么做的,按照UTF-8的格式URLDecoder.decode(url,"utf-8");应用的编码是GBK的
5 楼 m635674608 2013-09-28  
lv12312 写道
m635674608 写道
URLDecode解码,解出来的是GBK编码??? 不是吧??
我的意思不是这个,URLDecode是随便可以按照任何编码格式解码的,不限定是GBK,这是我应用中这么做的,按照UTF-8的格式URLDecoder.decode(url,"utf-8");应用的编码是GBK的

那你这样不就可以了吗?URLDecoder.decode(url,"gbk")
6 楼 lv12312 2013-09-28  
m635674608 写道
lv12312 写道
m635674608 写道
URLDecode解码,解出来的是GBK编码??? 不是吧??
我的意思不是这个,URLDecode是随便可以按照任何编码格式解码的,不限定是GBK,这是我应用中这么做的,按照UTF-8的格式URLDecoder.decode(url,"utf-8");应用的编码是GBK的

那你这样不就可以了吗?URLDecoder.decode(url,"gbk")
这样貌似也行,由于项目编码原因,还是需要多次转码,使用Base64之后,就转一次就OK了,虽然这样做稍微猥琐了一点,哈哈
7 楼 m635674608 2013-09-28  
lv12312 写道
m635674608 写道
lv12312 写道
m635674608 写道
URLDecode解码,解出来的是GBK编码??? 不是吧??
我的意思不是这个,URLDecode是随便可以按照任何编码格式解码的,不限定是GBK,这是我应用中这么做的,按照UTF-8的格式URLDecoder.decode(url,"utf-8");应用的编码是GBK的

那你这样不就可以了吗?URLDecoder.decode(url,"gbk")
这样貌似也行,由于项目编码原因,还是需要多次转码,使用Base64之后,就转一次就OK了,虽然这样做稍微猥琐了一点,哈哈

呵呵,方便就好
  相关解决方案