XMLHTTP 异步获取的时 HTML 页面,有中文会乱码,如何用 JS 对 responsebody 进行编码转换获取GB2312文本?
XMLHTTP 异步获取的时 HTML 页面,有中文会乱码,如何用 JS 对 responsebody 进行编码转换获取GB2312文本?
网络上都是用 VBS 客户端完成的,难道 JS 不能完成么?
问题点数:20、回复次数:34Top
1 楼meizz(梅花雪)回复于 2006-03-09 13:34:22 得分 0
取 responseText ,要取的目标页面编码另存为UTF-8格式Top
2 楼emu(月亮不在手指尖上)回复于 2006-03-09 14:12:21 得分 0
《XMLHTTP 乱码 的解决方法》在网上转载很多啦,比如 http://blog.czw.name/archives/60.html
一般是用vbscript转码,因为纯javascript只能用字典法转码。但是在繁体中文系统下vbs也转不出来gbk码,可以参考 http://www.blogjava.net/emu/articles/31756.html 的字典法转码。Top
3 楼Octer()回复于 2006-03-09 15:42:46 得分 0
楼上的各位,如果你的应用服务器在linux下,不知道能否解决楼主的问题, 比如用户的浏览器
是mozilla
我也正为此郁闷呢
Top
4 楼xuzuning(唠叨)回复于 2006-03-09 16:43:14 得分 0
用responseText接收数据,而不是用responsebody
responsebody得到的是二进制数据,js无法直接处理
原来可用adodb.stream处理,但打过补丁的ie就不能了。况且adodb.stream也不是什么环境都有的
其实只要服务器端返回的是utf-8编码的数据就不会乱码了
如果觉得在服务器端转码太麻烦,那么也只需要先返回一个声明语言类型的头(meta标记)Top
5 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-09 20:59:11 得分 0
我是要回写数据到 GB2312的页面中,不可能直接把 UTF-8 的文本显示在 GB2312的页面中Top
6 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-09 21:05:26 得分 0
那继续问下去,如果我在服务器上发送数据的时候直接用 VBS 的 ASC 对所有字符编码
for i = 1 to len(strWords)
strReturn = strReturn & "," & asc(mid(strWords,i,1))
next
然后将这个 strReturn 返回给客户端 JS 处理,能恢复出原来的数据么?
也就是 JS 有没有类似 VBS SPLIT 以及 CHR 的函数?Top
7 楼emu(月亮不在手指尖上)回复于 2006-03-09 21:19:21 得分 0
xuzuning(唠叨)
试验过responsebody是可以直接进行解码处理的。
>>我是要回写数据到 GB2312的页面中,不可能直接把 UTF-8 的文本显示在 GB2312的页面中
网上有很多编码规则的资料,先做好自己的功课,搞清楚自己要做的每个步骤应该是什么编码,才知道需要做什么转换。
>>如果我在服务器上发送数据的时候直接用 VBS 的 ASC 对所有字符编码
服务器应该不需要做这个编码。我介绍的文章里面明明白白的说是浏览器端编码,怎么不好好看就一个劲“继续问下去”?
>>也就是 JS 有没有类似 VBS SPLIT 以及 CHR 的函数?
查下javascript手册就知道了,做好自己的功课吧。
Top
8 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-09 23:27:18 得分 0
>>我是要回写数据到 GB2312的页面中,不可能直接把 UTF-8 的文本显示在 GB2312的页面中
网上有很多编码规则的资料,先做好自己的功课,搞清楚自己要做的每个步骤应该是什么编码,才知道需要做什么转换。-------有资料么?我去 GOOGLE 用“编码”查了,由于太多,无法确定你说的是哪种类型,请给出地址,谢谢!
>>如果我在服务器上发送数据的时候直接用 VBS 的 ASC 对所有字符编码
服务器应该不需要做这个编码。我介绍的文章里面明明白白的说是浏览器端编码,怎么不好好看就一个劲“继续问下去”?--------------你已经明确说明 JS 不能做编码转换,但是我现在必须在客户端用JS 获取服务器端返回的“GB2312中文字符”,所以我只能另想方法。
>>也就是 JS 有没有类似 VBS SPLIT 以及 CHR 的函数?
查下javascript手册就知道了,做好自己的功课吧。---------我翻过了,没找到,如果你知道可以提示我是哪个字符,如果你不知道就直接说“不知道”
Top
9 楼meizz(梅花雪)回复于 2006-03-09 23:43:32 得分 0
每个人对你的贴子的回复,都是对你的贴子的关心,不论良莠。且据我所知 emu 能算得上是国内 AJAX 界顶尖的人物之一。很多问题不能是让别人代劳,应该说是一点一拔即通。
JS没有对二进制解码的系统函数,这方面不如VBS,因为VBS里有 ASCB LEFTB RIGHTB LENB 之类的一系列针对二进制的系统函数
在客户端对二进制转码已经有很多这方面的函数或解决方案,你也不用到别的地方去找,你只要在ASP版或者JS版的FAQ里找就够多了。
在JS版头些天万常华大哥还刚发过一个用JS解决编码的贴子,不要抱怨,多份讨论的心Top
10 楼emu(月亮不在手指尖上)回复于 2006-03-10 01:08:19 得分 20
呵呵,我都说“搞清楚自己要做的每个步骤应该是什么编码,才知道需要做什么转换”了嘛,需要那种编码类型是你要做的决定,而不是你要去google出答案的问题。关键不是你要搞清楚怎么编码转换,而是要搞清楚你需要什么编码。
比如说,你打算整个网站所有页面和保存到数据库的数据都用utf-8编码,那么恭喜恭喜,web世界中utf-8是最受欢迎的编码方式,你应该不大会需要做多余的编码。
但是假如你的整个网站的页面和数据库保存的数据、web服务器处理的数据都用gbk(gb2312,gb18030)编码,那么你的服务程序向浏览器发送数据的时候就要注意了,你需要正确的声明你的xml声明中的encoding,浏览器才能替你正确的解码,因此你也不能使用AjaH方式简单的返回字符串后在浏览器端处理responseText或者responseBody,除非你打算自己做解码。
这还好说。如果你试图从浏览器向服务器发送数据,更加需要小心了。如果你打算用get方式发送少量的汉字数据,可以直接把汉字作为参数值拼到url后面,这样浏览器可以根据页面的编码设定来编码汉字。如果你打算post比较多的数据,那么当你吧汉字放到send(data)中的时候会自动被浏览器按照utf-8编码,你连声明编码方式的机会都没有,因此你可以在服务器端做utf-8解码后重新编码成gbk处理和保存,也可以在浏览器端用vbscript获得汉字gbk编码后按照urlencode方式把汉字当成二进制数据送进xmlhttp,这样服务器就不需要多于的解码了。
这是我能做的最详细的解释了,但是我很怀疑你是不是被我说晕了@-@。
>>你已经明确说明 JS 不能做编码转换,但是我现在必须在客户端用JS 获取服务器端返回的“GB2312中文字符”
我从来没有说过JS不能做编码转换,我的原话是“一般是用vbscript转码,因为纯javascript只能用字典法转码。但是在繁体中文系统下vbs也转不出来gbk码,可以参考 http://www.blogjava.net/emu/articles/31756.html 的字典法转码。”
也就是说,你可以用vbs获得gbk编码,也可以在我给出的地址上找到我写的纯js做gbk编码的脚本。此外用fromCharCode还可以轻易获得unicode编码,当然我们也常用escape来做。
而且如果你服务器端返回的是GB2312中文字符,只需要把你的数据包装成合法的xml格式之后在xml声明中声明 encoding="GB2312" 就可以了。这个帖子就是用gb2312(其实是gbk了)编码的xml生成的,在浏览器上查看一下这个帖子的页面源码你就会得到一个很标准的示范:
<?xml version="1.0" encoding="GB2312"?>
>>也就是 JS 有没有类似 VBS SPLIT 以及 CHR 的函数?
请查String对象的方法就可以了。这是字符串处理,当然应该在String对象上查了,很难想到吗?Top
11 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-10 08:51:56 得分 0
楼上的回答非常详细,谢谢
但还有不明白的方法
那么你的服务程序向浏览器发送数据的时候就要注意了,你需要正确的声明你的xml声明中的encoding,--------如果我从服务器向客户端发送的不是一个完整的 XML 文档,而是1千到2千字节的 HTML 的GB2312的文本,是否也要设置 ENCODING ?如何设置?
>>也就是 JS 有没有类似 VBS SPLIT 以及 CHR 的函数?
请查String对象的方法就可以了。这是字符串处理,当然应该在String对象上查了,很难想到吗?---------------STRING 我已经看过了,由于我是做 VBA 的,JS 不熟悉,虽然看了帮助把所有的 STRING 方法全看了一遍,但仍然不清楚到底是哪个方法有用。
比如 SPLIT 也许就不能实现。是否能够通过正则来一个一个匹配然后再处理呢?
'123,11,223,' 我返回给客户端的文本应该类似前面这样的
Top
12 楼emu(月亮不在手指尖上)回复于 2006-03-10 09:31:32 得分 0
1 我不明白为什么一定要用纯html和文本,用xml包装一下很麻烦吗?害怕html被转义大可以用cdata包装一下啊。
2 你真的查了javascript的String的参考吗?看看这下面有没有split呢?有没有类似chr的函数呢?
属性
constructor 属性 | length 属性 | prototype 属性
方法
anchor 方法 | big 方法 | blink 方法 | bold 方法 | charAt 方法 | charCodeAt 方法 | concat 方法 | fixed 方法 | fontcolor 方法 | fontsize 方法 | fromCharCode 方法 | indexOf 方法 | italics 方法 | lastIndexOf 方法 | link 方法 | match 方法 | replace 方法 | search 方法 | slice 方法 | small 方法 | split 方法 | strike 方法 | sub 方法 | substr 方法 | substring 方法 | sup 方法 | toLowerCase 方法 | toUpperCase 方法 | toString 方法 | valueOf 方法
要求
版本 1
请参阅
new 运算符
Top
13 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-10 10:58:34 得分 0
也就是说你的建议是直接包装为 XML 返回,然后在客户端用 responseXML 以及 XML DOM 做操作咯?Top
14 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-10 11:04:27 得分 0
我另外开了个贴子,emu(月亮不在手指尖上) 去拿分
http://community.csdn.net/Expert/topic/4605/4605317.xml?temp=.5056269Top
15 楼mingxuan3000(铭轩)回复于 2006-03-10 13:45:11 得分 0
markTop
16 楼rollenc(rollenc)回复于 2006-03-19 15:50:18 得分 0
MARKTop
17 楼kindma(乐米)回复于 2006-03-20 09:54:24 得分 0
用AJAX来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字会正确显示,而送出了GBK编码流的时候就乱了。解决的办法就是在送出的流里面加一个HEADER,指明送出的是什么编码流,这样XMLHTTP就不会乱搞了。
PHP:header('Content-Type:text/html;charset=GB2312');
ASP:Response.Charset("GB2312")
JSP:response.setHeader("Charset","GB2312");
这个小问题居然困挠一家人好长时间!Top
18 楼yjgx007(还不结帖?!听妈妈的话! http://www.geekclaw.com)回复于 2006-03-20 17:14:34 得分 0
又是字符编码问题,唉!Top
19 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-21 01:02:08 得分 0
JS escape() unescape()
C# Server.UriEcode() Server.UriDecode()Top
20 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-21 01:04:59 得分 0
我的办法在英文版系统上都好用。Top
21 楼you34(蚊子)回复于 2006-03-31 15:13:17 得分 0
请楼主公布解决办法,谢谢......Top
22 楼lwter(滔滔不绝)回复于 2006-04-01 11:55:30 得分 0
我尝试过用xml传输,我的XML格式如下:
<?xml version="1.0" encoding="gb2312">
<content>
中文字
</content>
返回的数据在gb2312页面显示,在firefox正常,但在IE就是一团乱码?
很闷呀!
Top
23 楼epjack(笨蛋一个)回复于 2006-04-04 01:07:06 得分 0
最简单的,返回responseXML.xmlTop
24 楼dongfei(风月无影)回复于 2006-04-15 11:15:11 得分 0
markTop
25 楼gq(游子)回复于 2006-04-25 14:02:26 得分 0
学习。。碰上了该问题。Top
26 楼linxhome()回复于 2006-05-03 14:26:59 得分 0
估计是没人帮解决了的Top
27 楼zhouzhenxin(寒心月)回复于 2006-05-03 18:43:01 得分 0
我在jsp页面上设置了contentType="text/html;charset=gb2312"
我总结了一下ajax乱码问题.主要有三个地方.
1.传入中文参数时乱码
解决.string value = new String(in.getByte("iso8859-1"),"gb2312");
注意,这里只能用gb2312 or GBK
2.输出中文乱码
解决contentType="text/html;charset=gb2312"
注意,如果你设response.setCharEncoding="gb2312"没有用.
3.大文本传输时中文乱码
解决string value = new String(in.getByte("iso8859-1"),"UTF-8");
注意,只能用UTF-8才能正确显示
只对j2ee有用.请各位指教Top
28 楼xiehuiqi(谢)回复于 2006-05-05 09:47:11 得分 0
vbs可以和js混用
在js里面可以调用vbs里面的函数
用vbs解码,js调用是可以实现的
------------------------------
还有一种方法是对汉字进行两次escape
然后取的时候进行两次unescape即可
Top
29 楼Scarroot(每天一贴,把分用完.)回复于 2006-05-05 18:29:09 得分 0
markTop
30 楼xiongzai(熊仔)回复于 2006-05-08 01:30:22 得分 0
在这里,非常感谢zhouzhenxin(寒心月)
搞了一晚的问题终于解决了……Top
31 楼zhouzhenxin(寒心月)回复于 2006-05-09 15:34:34 得分 0
老大,问题解决了又不给分。
55555555555555555555555555Top
32 楼yushulingfeng(跑不快)回复于 2006-05-09 16:05:10 得分 0
在ASP.NET中应用AJAX时解决中文乱码问题很简单.
只要在WEB.CONFIG中设置:请求UTF-8 响应GB2312
就OK了.哈哈,其他系统就不知道了.Top
33 楼xiehuiqi(谢)回复于 2006-05-09 16:13:02 得分 0
呵呵,谢谢寒心月Top
34 楼spacener(空中楼阁)回复于 2006-05-10 23:14:49 得分 0
http://www.topee.cn/
刚完成的!
交流
Top
相关问题
- 关于xmlhttp异步方式回调的问题
- 如何用客户端vbscript异步调用xmlhttp?
- 关于xmlhttp异步获取数据的问题。
- 异步!!!
- XMLHTTP迷惑问题之三:同步和异步的实质区别和用途上的差异?
- 通过xmlhttp异步获取的的数据,如何被别的函数调用呢
- (Ajax相关)多个异步XMLHTTP操作,如何判断前面的已经执行完成
- 使用xmlhttp异步获取数据造成网页反应迟钝,如何解决
- 用xmlhttp将html的数据打包成multipart/form-data格式,实现异步上传文件功能
- 用xmlhttp将html的数据打包成multipart/form-data格式,实现异步上传文件功能




