完美解决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 相关文章推荐
JavaScript高级程序设计
Dec 29 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
Jul 18 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
Jan 22 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
Apr 11 Javascript
详解JavaScript事件循环机制
Sep 07 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
Angular8 Http拦截器简单使用教程
Aug 20 Javascript
原生JS实现天气预报
Jun 16 Javascript
微信小程序返回上一级页面的实现代码
Jun 19 Javascript
微信小程序实现天气预报功能(附源码)
Dec 10 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学习之 数组声明
2011/06/09 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
JavaScript 应用类库代码
2008/06/02 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
Python用模块pytz来转换时区
2016/08/19 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
加多宝凉茶广告词
2014/03/18 职场文书
论文评语大全
2014/04/29 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
使用Redis实现实时排行榜功能
2021/07/02 Redis
spring boot中nativeQuery的用法
2021/07/26 Java/Android