解决JavaScript中汉字显示乱码问题:XMLHTTP与编码处理
本文探讨JavaScript在处理中文时出现的乱码问题,特别是使用document.write嵌套输出和XMLHTTP异步获取数据时的编码冲突。通过分析GB2312与UTF-8编码差异,演示了利用VBScript编写bytes2BSTR函数转换responseBody的方法,以解决IE环境下中文显示异常及数据提交乱码的情况。
如题,此前浏览了多篇相关讨论,现决定将近期研究心得分享于此。凡涉及JS乱码问题,皆可汇集于此共同探讨。
document.write嵌套导致的中文乱码
场景一:write输出的内容为utf-8格式,若保存的数据中包含非utf-8编码的中文,在write嵌套超过两次时会出现乱码。因无现成文件,临时制作了一个示例,此为1.htm页面代码:
代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="JavaScript" src="1.js"></script>
</head>
<body onload=myjs(1)>
</body>
</html> 这是引用的1.js文件代码,两个文件均使用简体中文保存,而非utf-8格式。
代码如下:
//这是JS递归自写过程中汉字乱码的演示程序
//不仅是中文内容,就连注释如果是中文有时也会出现问题
//感觉JS一碰上中文就变得很不稳定=_='
//Dec. 29th 2005 created by shouhaimu(QQ:30836570)
function myjs(i)
{
var t="<html>\n";
t+="<head>\n";
t+="<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>\n";
t+="<script language='JavaScript' src='1.js'></script>\n";
t+="</head>\n";
t+="<body>\n";
t+="<input type=button onclick=myjs("+(i+1)+" value='这是演示程序,已经运行了"+i+"次!'>\n";
//上面这行如果改成下面这句就可以正常显示,看来确实是JS对汉字的支持不够好:
//t+="<input type=button onclick=myjs("+(i+1)+" value='This is my code,it has run "+i+" times!'>\n";
t+="</body>\n";
t+="</html>\n";
document.open();
document.write(t);
document.close();
} 运行第2次以上就会有乱码。
XMLHTTP获取数据的编码处理
场景二:通过XMLHTTP获取文件后再输出时,若该文件包含中文信息并按gb编码,显示时中文信息会是乱码。
js代码如下:(注释是发贴子时候加的,如果怕干扰可以去掉)
代码如下:
<SCRIPT language="JavaScript" type="text/JavaScript">
self.onerror=null;
var Http = new ActiveXObject("Microsoft.XMLHTTP";
Http.open("GET",URL,false); //URL是您需要获取的页面的网址
Http.send();
document.write(Http.responseText);
</SCRIPT>
后来用VBS解决,改成如下:
<SCRIPT language="VBScript" type="text/VBScript">
Function bytes2BSTR(vIn)
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function
set Http = CreateObject("Microsoft.XMLHTTP"
Http.open "Get",URL,false //URL是您需要获取的页面的网址
Http.send ""
document.write(bytes2BSTR(Http.responseBody))
</SCRIPT>注:上面的bytes2BSTR只能对responseBody操作阿,responseText操作就不能正常显示阿,因为responseText是系统按默认编码加工以后的东东了,是一堆乱码,没法处理。但是这样倒是能读简体中文的文件了,但是读utf-8又会出错。
JS运行时汉字乱码相关问题的讨论(编辑中出现的问题请参考其他专题贴)
首先感谢斑竹得指教,这个页面不错,收藏了,具体内容研习中
http://sheneyan.com/test/testAjaxPost.htm
有些我也听说过,也做过测试,关键还有三个疑团没有解开:
一、即使是曾经正常显示的页面,如果用了后退或者读取了一个非utf-8页面以后也不能正常显示了;
二、即使所有的防乱码(当然重新编码的除外)措施都采用了,并且用同一程序打开铜一个页面,也不能保证每次出来的页面都能稳定地显示为中文;
三、远程获取数据提交表单的问题,如果目标网站用了编码和解码,那么意味着如果显示的正常了,提交的内容就成了乱码,反之,亦然。于是不得不预先对所有获取的内容重新编码,这样就离不开编码程序,也就摆脱不了VBS得阴影=_='
刚才测试中还发现个问题
先前发的VBS重编码函数,如果页面太大,IE会挂掉,具体多大估计和缓存及内存大小有关系。总之,如果让我对中文支持的程度排序得话JS<VBS<ASP<HTML,HTML都静态了,当然最稳定,所以做动态页,如果不是非得客户端运行,强烈建议用ASP生成代码。
斑竹给得页面页能打开了,我对Ajax和xml都还比较陌生,虽然有听说,但一直没有介入,可否简单介绍下,如果论坛上不方便说,可以加我QQ,资料中有,谢谢了!
JS中使用位运算(~~)和一元加号(+)快速转换字符串为整数
2026-11-03 22:41:12
怎么使用命令行批量格式化项目中的JS文件
2026-11-03 19:04:42
JS代码美化后报错怎么办?常见格式化冲突解决方法
2026-11-03 18:47:01
不用moment.js,怎么用原生JS Intl API格式化时间戳
2026-11-03 18:10:30
原生JS与dayjs获取当前日期的代码对比
2026-11-03 17:57:26
