完美解決JS中漢字顯示亂碼問(wèn)題(已解決)
更新時(shí)間:2006年12月27日 00:00:00 作者:
如題,剛才看了幾篇大家的討論,忽然也想起要將自己最近研究的問(wèn)題貼出來(lái),凡是和JS中亂碼相關(guān)的問(wèn)題都發(fā)到這里把,大家一起研究。:)
場(chǎng)景一:write寫出來(lái)的內(nèi)容是utf-8格式的,如果保存的write數(shù)據(jù)中有不是utf-8編碼的中文,對(duì)write嵌套倆次以上就會(huì)有亂碼。由于手頭沒(méi)有現(xiàn)成的文件,剛才臨時(shí)制作了一個(gè),這是1.htm頁(yè)面的代碼:
這是引用的1.js文件代碼,倆個(gè)文件均用簡(jiǎn)體中文保存而不是utf-8
場(chǎng)景二:通過(guò)XMLHTTP獲取文件后再輸出時(shí),如果該文件包含中文信息并按gb編碼,顯示時(shí)中文信息會(huì)是亂碼。
js代碼如下:(注釋是發(fā)貼子時(shí)候加的,如果怕干擾可以去掉)
JS運(yùn)行時(shí)漢字亂碼相關(guān)問(wèn)題的討論(編輯中出現(xiàn)的問(wèn)題請(qǐng)參考其他專題貼)
首先感謝斑竹得指教,這個(gè)頁(yè)面不錯(cuò),收藏了,具體內(nèi)容研習(xí)中
http://sheneyan.com/test/testAjaxPost.htm
有些我也聽說(shuō)過(guò),也做過(guò)測(cè)試,關(guān)鍵還有三個(gè)疑團(tuán)沒(méi)有解開:
一、即使是曾經(jīng)正常顯示的頁(yè)面,如果用了后退或者讀取了一個(gè)非utf-8頁(yè)面以后也不能正常顯示了;
二、即使所有的防亂碼(當(dāng)然重新編碼的除外)措施都采用了,并且用同一程序打開銅一個(gè)頁(yè)面,也不能保證每次出來(lái)的頁(yè)面都能穩(wěn)定地顯示為中文;
三、遠(yuǎn)程獲取數(shù)據(jù)提交表單的問(wèn)題,如果目標(biāo)網(wǎng)站用了編碼和解碼,那么意味著如果顯示的正常了,提交的內(nèi)容就成了亂碼,反之,亦然。于是不得不預(yù)先對(duì)所有獲取的內(nèi)容重新編碼,這樣就離不開編碼程序,也就擺脫不了VBS得陰影=_='
剛才測(cè)試中還發(fā)現(xiàn)個(gè)問(wèn)題
先前發(fā)的VBS重編碼函數(shù),如果頁(yè)面太大,IE會(huì)掛掉,具體多大估計(jì)和緩存及內(nèi)存大小有關(guān)系??傊绻屛覍?duì)中文支持的程度排序得話JS<VBS<ASP<HTML,HTML都靜態(tài)了,當(dāng)然最穩(wěn)定,所以做動(dòng)態(tài)頁(yè),如果不是非得客戶端運(yùn)行,強(qiáng)烈建議用ASP生成代碼。
斑竹給得頁(yè)面頁(yè)能打開了,我對(duì)Ajax和xml都還比較陌生,雖然有聽說(shuō),但一直沒(méi)有介入,可否簡(jiǎn)單介紹下,如果論壇上不方便說(shuō),可以加我QQ,資料中有,謝謝了!
場(chǎng)景一:write寫出來(lái)的內(nèi)容是utf-8格式的,如果保存的write數(shù)據(jù)中有不是utf-8編碼的中文,對(duì)write嵌套倆次以上就會(huì)有亂碼。由于手頭沒(méi)有現(xiàn)成的文件,剛才臨時(shí)制作了一個(gè),這是1.htm頁(yè)面的代碼:
復(fù)制代碼 代碼如下:
<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>
<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文件代碼,倆個(gè)文件均用簡(jiǎn)體中文保存而不是utf-8
復(fù)制代碼 代碼如下:
//這是JS遞歸自寫過(guò)程中漢字亂碼的演示程序
//不光是中文內(nèi)容不行,就連注釋如果是中文有時(shí)候也不行
//感覺(jué)JS一碰上中文就變得很不穩(wěn)定=_='
//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='這是演示程序,已經(jīng)運(yùn)行了"+i+"次!'>\n";
//上面這行如果改成下面這句就可以正常顯示,看來(lái)確實(shí)是JS對(duì)漢字的支持不夠好:
//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();
}
運(yùn)行第2次以上就會(huì)有亂碼。 //不光是中文內(nèi)容不行,就連注釋如果是中文有時(shí)候也不行
//感覺(jué)JS一碰上中文就變得很不穩(wěn)定=_='
//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='這是演示程序,已經(jīng)運(yùn)行了"+i+"次!'>\n";
//上面這行如果改成下面這句就可以正常顯示,看來(lái)確實(shí)是JS對(duì)漢字的支持不夠好:
//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();
}
場(chǎng)景二:通過(guò)XMLHTTP獲取文件后再輸出時(shí),如果該文件包含中文信息并按gb編碼,顯示時(shí)中文信息會(huì)是亂碼。
js代碼如下:(注釋是發(fā)貼子時(shí)候加的,如果怕干擾可以去掉)
復(fù)制代碼 代碼如下:
<SCRIPT language="JavaScript" type="text/JavaScript">
self.onerror=null;
var Http = new ActiveXObject("Microsoft.XMLHTTP";
Http.open("GET",URL,false); //URL是您需要獲取的頁(yè)面的網(wǎng)址
Http.send();
document.write(Http.responseText);
</SCRIPT>
后來(lái)用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是您需要獲取的頁(yè)面的網(wǎng)址
Http.send ""
document.write(bytes2BSTR(Http.responseBody))
</SCRIPT>
注:上面的bytes2BSTR只能對(duì)responseBody操作阿,responseText操作就不能正常顯示阿,因?yàn)閞esponseText是系統(tǒng)按默認(rèn)編碼加工以后的東東了,是一堆亂碼,沒(méi)法處理。但是這樣倒是能讀簡(jiǎn)體中文的文件了,但是讀utf-8又會(huì)出錯(cuò)。self.onerror=null;
var Http = new ActiveXObject("Microsoft.XMLHTTP";
Http.open("GET",URL,false); //URL是您需要獲取的頁(yè)面的網(wǎng)址
Http.send();
document.write(Http.responseText);
</SCRIPT>
后來(lái)用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是您需要獲取的頁(yè)面的網(wǎng)址
Http.send ""
document.write(bytes2BSTR(Http.responseBody))
</SCRIPT>
JS運(yùn)行時(shí)漢字亂碼相關(guān)問(wèn)題的討論(編輯中出現(xiàn)的問(wèn)題請(qǐng)參考其他專題貼)
首先感謝斑竹得指教,這個(gè)頁(yè)面不錯(cuò),收藏了,具體內(nèi)容研習(xí)中
http://sheneyan.com/test/testAjaxPost.htm
有些我也聽說(shuō)過(guò),也做過(guò)測(cè)試,關(guān)鍵還有三個(gè)疑團(tuán)沒(méi)有解開:
一、即使是曾經(jīng)正常顯示的頁(yè)面,如果用了后退或者讀取了一個(gè)非utf-8頁(yè)面以后也不能正常顯示了;
二、即使所有的防亂碼(當(dāng)然重新編碼的除外)措施都采用了,并且用同一程序打開銅一個(gè)頁(yè)面,也不能保證每次出來(lái)的頁(yè)面都能穩(wěn)定地顯示為中文;
三、遠(yuǎn)程獲取數(shù)據(jù)提交表單的問(wèn)題,如果目標(biāo)網(wǎng)站用了編碼和解碼,那么意味著如果顯示的正常了,提交的內(nèi)容就成了亂碼,反之,亦然。于是不得不預(yù)先對(duì)所有獲取的內(nèi)容重新編碼,這樣就離不開編碼程序,也就擺脫不了VBS得陰影=_='
剛才測(cè)試中還發(fā)現(xiàn)個(gè)問(wèn)題
先前發(fā)的VBS重編碼函數(shù),如果頁(yè)面太大,IE會(huì)掛掉,具體多大估計(jì)和緩存及內(nèi)存大小有關(guān)系??傊绻屛覍?duì)中文支持的程度排序得話JS<VBS<ASP<HTML,HTML都靜態(tài)了,當(dāng)然最穩(wěn)定,所以做動(dòng)態(tài)頁(yè),如果不是非得客戶端運(yùn)行,強(qiáng)烈建議用ASP生成代碼。
斑竹給得頁(yè)面頁(yè)能打開了,我對(duì)Ajax和xml都還比較陌生,雖然有聽說(shuō),但一直沒(méi)有介入,可否簡(jiǎn)單介紹下,如果論壇上不方便說(shuō),可以加我QQ,資料中有,謝謝了!
相關(guān)文章
js中的鼠標(biāo)事件有哪些(用法示例學(xué)習(xí)進(jìn)階)
在JavaScript中,鼠標(biāo)事件是 Web 開發(fā)中最常用的事件類型。鼠標(biāo)點(diǎn)擊事件包括 4 個(gè):click(單擊)、dblclick(雙擊)、mousedown(按下)和 mouseup(松開)。其中 click 事件類型比較常用,而 mousedown和mouseup事件類型多用在鼠標(biāo)拖放、拉伸操作中。2023-02-02
Javascript WebSocket使用實(shí)例介紹(簡(jiǎn)明入門教程)
網(wǎng)絡(luò)套接字是下一代WEB應(yīng)用程序雙向通信技術(shù),它是基于一個(gè)獨(dú)立的socket并且需要客戶端瀏覽器支持HTML52014-04-04
在JavaScript應(yīng)用中實(shí)現(xiàn)延遲加載的方法
這篇文章主要介紹了在JavaScript應(yīng)用中實(shí)現(xiàn)延遲加載的方法,利用RequireJS框架,需要的朋友可以參考下2015-06-06
微信小程序訪問(wèn)node.js接口服務(wù)器搭建教程
這篇文章主要給大家分享了微信小程序訪問(wèn)node.js接口服務(wù)器的搭建教程,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)跟著小編一起看看吧。2017-04-04
ajax上傳時(shí)參數(shù)提交不更新等相關(guān)問(wèn)題
我感覺(jué)好像這個(gè)上傳插件只在第一次點(diǎn)擊的時(shí)候?qū)嵗?shù)傳給后臺(tái),所以以后值都是不變的,應(yīng)該怎么解決這個(gè)問(wèn)題呢2012-12-12

