完美解决JS中汉字显示乱码问题(已解决)


Posted in Javascript onDecember 27, 2006

如题,刚才看了几篇大家的讨论,忽然也想起要将自己最近研究的问题贴出来,凡是和JS中乱码相关的问题都发到这里把,大家一起研究。:)
场景一:write写出来的内容是utf-8格式的,如果保存的write数据中有不是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获取文件后再输出时,如果该文件包含中文信息并按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,资料中有,谢谢了!

Javascript 相关文章推荐
use jscript with List Proxy Server Information
Jun 11 Javascript
javascript 清除输入框中的数据
Apr 13 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
Jan 22 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
jquery实现的动态回到顶部特效代码
Oct 28 Javascript
Angular.js回顾ng-app和ng-model使用技巧
Apr 26 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
vue高德地图之玩转周边
Jun 16 Javascript
vue2.0学习之axios的封装与vuex介绍
May 28 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 Javascript
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
Dec 27 #Javascript
从javascript语言本身谈项目实战
Dec 27 #Javascript
JavaScript实现禁止后退的方法
Dec 27 #Javascript
utf8的编码算法 转载
Dec 27 #Javascript
ie和firefox中img对象区别的困惑
Dec 27 #Javascript
使用javascript访问XML数据的实例
Dec 27 #Javascript
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 #Javascript
You might like
PHP版 汉字转码的实现详解
2013/06/09 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
js 目录列举函数
2008/11/06 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
python中id函数运行方式
2020/07/03 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
如何利用find命令查找文件
2016/11/18 面试题
什么是lambda函数
2013/09/17 面试题
采购员岗位职责
2013/11/15 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
食品安全责任书
2014/04/15 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技