完美解决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 相关文章推荐
jQuery 动画基础教程
Dec 25 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
Sep 04 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
Jan 18 Javascript
Javascript通过overflow控制列表闭合与展开的方法
May 15 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
关于Vue组件库开发详析
Jul 01 Javascript
利用js-cookie实现前端设置缓存数据定时失效
Jun 18 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 Javascript
vue实现表格合并功能
Dec 01 Vue.js
JavaScript 语句之常用 for 循环详解
Mar 29 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
PHP 函数语法介绍一
2009/06/14 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Flask之请求钩子的实现
2018/12/23 Python
Django 批量插入数据的实现方法
2020/01/12 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
Django日志及中间件模块应用案例
2020/09/10 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
解除劳动合同证明书
2014/09/26 职场文书
学习退步检讨书
2014/09/28 职场文书
贫困证明书范文
2015/06/16 职场文书
表扬信范文
2019/04/22 职场文书