- 主题:问个js发get请求的编码问题
我的js是utf-8编码,
现在要在js中向某个gb2312编码的网站的网页发get请求然后
得到返回值(网页),
其中请求url为http://***.com/?q=keyword
而要传的keyword有汉子或日韩等文字
所以当我发请求时(这里用XMLHttpRequest的open('GET', url, true)方法),
var url = "http://***.com/?q=" + encodeURIComponent(keyword);
由于encodeURIComponent方法是用utf-8编码的,所以行不通,
***.com网站只接受gb2312编码的urlencode,
(比如中文"我"字的gb2312方式url编码后为:%CE%D2
而utf-8方式url编码后为:%E6%88%91)
请问有什么办法让keyword用gb2312编码来urlencode,然后发送请求?
在这里看到说3种方法,ms都不是很理想:
http://www.jb51.net/article/21686.htm
--
FROM 211.99.222.*
啥意思?
【 在 dhcn (小石) 的大作中提到: 】
: 客户端encode两次,服务器端decode一次。
--
FROM 211.99.222.*
你是说url改成:
var keyword="我";
var url="http://***.com/?q="+encodeURIComponent(encodeURIComponent(keyword));
这样请求这个url就可以了?
【 在 dhcn (小石) 的大作中提到: 】
: 浏览器提交XHR之前,对中文表单数据ecodeuri两次,在服务器端接受这部分数据后对其decode一次,就可以得到正确的中文了。
--
FROM 211.99.222.*
我想我明白你的意思了
但可惜这个***.com是公网一个第三方网站
我无权修改其服务器代码
【 在 dhcn (小石) 的大作中提到: 】
: 标 题: Re: 问个js发get请求的编码问题
: 发信站: 水木社区 (Mon Dec 30 13:43:07 2013), 站内
:
: 嗯,服务器端再做一次decode操作就能得到GB字符。
: 【 在 chwork 的大作中提到: 】
: : 你是说url改成:
: : var keyword="我";
: : var url="http://***.com/?q="+encodeURIComponent(encodeURIComponent(keyword));
: : ...................
:
: --
: 玉不琢,不成器。
: 读千卷书,行千万里路。
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 124.42.13.*]
--
FROM 211.99.222.*
倒 ms都没有encodeURLComponent这个方法
【 在 zxdong262 (html5beta.com) 的大作中提到: 】
: encodeURLComponent(escape( url ))
--
FROM 211.99.222.*
(1)
网上有人用form利用accept-charset设置成gbk
来submit,target设为新加的一个iframe
action设为服务器端某个静态的html内容为:
<script>
parent._urlEncode_iframe_callback && parent._urlEncode_iframe_callback(loca
tion.search.split('=')[1]);
</script>
但这种方法需要在服务器端放一个html 如果这样我还不如
放一个php 在php里搞定gbk编码返回就是了
因为我是写chrome插件 所以暂时不想用到任何服务器端开发
(2)
网上找到一个是定义了一个编码数组的:
var gbData = [];
setGbData();
alert(URLEncodeOld("我"));
function setGbData(){
gbData = [ // 一个中文常量数组,内容太长贴小部分
'啊阿埃...................'];
}
function URLEncodeOld(vStr) {
var vGet = new String();
for (var i = 0; i < vStr.length; i ++) {
var tmp = vStr.charAt(i);
var reg = /^[\u4e00-\u9fa5\uf900-\ufa2d]$/;
if (reg.test(tmp)) {
for (var area = 0; area < gbData.length; area ++) {
var place = gbData[area].indexOf(tmp) + 1;
if (place) {
area += 16;
vGet += '%' + getUCase((0xA0 + area).toString(16))
;
vGet += '%' + getUCase((0xA0 + place).toString(16)
);
break;
}
}
} else {
var vPos ='~!@#$%^&*()-_+={}[]|\\:;"\'<>,.?/`'.indexOf(tmp)
;
vGet += vPos != -1 ? '%' + getUCase(tmp.charCodeAt(0).toStr
ing(16)) : tmp;
}
}
return vGet.replace(/\s/g, '+');
function getUCase(v) { return v.toUpperCase(); }
}
【 在 Orpherus (奥路菲) 的大作中提到: 】
: 扣一个utf-8 to gbk的编码转换库出来
--
FROM 211.99.222.*
后来发现(2)中提供的只是中文字库,遇到日韩文字就不行了.
又找到一个在我现在机器的chrome31下可行的方法,于是决定
用(3)中的方法,当不行时,就用(2)中的结果:
(3)
var gbkIframe=document.createElement("iframe");
gbkIframe.src="about:blank";
gbkIframe.setAttribute("style","display:none;visibility:hidden;width:0
;height:0;scrolling:no;allowtransparency:true;frameborder:0;");
document.body.appendChild(gbkIframe);
var d=gbkIframe.contentWindow.document;
d.charset=d.characterSet="GBK";
alert(URLEncode("我そば"));
function URLEncode(s) {
if(null == gbkIframe || gbkIframe == 'undefined') {
return URLEncodeOld(s);
}
var ss = s.replace("'",'%27');
var d=gbkIframe.contentWindow.document;
d.charset=d.characterSet="GBK";
d.open();
d.write("<body><a href='?"+ss+"'>X</a></body>");
d.close();
var url=d.body.firstChild.href;
var ret=url.substr(url.lastIndexOf("?")+1);
var ret1=URLEncodeOld(s);
if(ret.length < ret1.length) {
return ret1;
}
return ret;
}
【 在 chwork (work) 的大作中提到: 】
: 标 题: Re: 问个js发get请求的编码问题
: 发信站: 水木社区 (Mon Dec 30 17:16:58 2013), 站内
:
: (1)
: 网上有人用form利用accept-charset设置成gbk
: 来submit,target设为新加的一个iframe
: action设为服务器端某个静态的html内容为:
: <script>
: parent._urlEncode_iframe_callback && parent._urlEncode_iframe_callback(loca
: tion.search.split('=')[1]);
: </script>
:
: 但这种方法需要在服务器端放一个html 如果这样我还不如
: 放一个php 在php里搞定gbk编码返回就是了
:
: 因为我是写chrome插件 所以暂时不想用到任何服务器端开发
:
:
: (2)
: 网上找到一个是定义了一个编码数组的:
:
: var gbData = [];
: setGbData();
: alert(URLEncodeOld("我"));
:
: function setGbData(){
: gbData = [ // 一个中文常量数组,内容太长贴小部分
: '啊阿埃...................'];
: }
:
: function URLEncodeOld(vStr) {
:
: var vGet = new String();
:
: for (var i = 0; i < vStr.length; i ++) {
:
: var tmp = vStr.charAt(i);
:
: var reg = /^[\u4e00-\u9fa5\uf900-\ufa2d]$/;
:
: if (reg.test(tmp)) {
:
: for (var area = 0; area < gbData.length; area ++) {
:
: var place = gbData[area].indexOf(tmp) + 1;
:
: if (place) {
:
: area += 16;
:
: vGet += '%' + getUCase((0xA0 + area).toString(16))
: ;
:
: vGet += '%' + getUCase((0xA0 + place).toString(16)
: );
:
: break;
:
: }
:
: }
:
: } else {
:
: var vPos ='~!@#$%^&*()-_+={}[]|\\:;"\'<>,.?/`'.indexOf(tmp)
: ;
:
: vGet += vPos != -1 ? '%' + getUCase(tmp.charCodeAt(0).toStr
: ing(16)) : tmp;
:
: }
:
: }
:
: return vGet.replace(/\s/g, '+');
:
: function getUCase(v) { return v.toUpperCase(); }
:
: }
:
:
: 【 在 Orpherus (奥路菲) 的大作中提到: 】
: : 扣一个utf-8 to gbk的编码转换库出来
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 211.99.222.*]
--
FROM 211.99.222.*
en
不过你提供的方法不行
【 在 zxdong262 (html5beta.com) 的大作中提到: 】
: encodeURIComponent
--
FROM 211.99.222.*