主頁(yè) > 知識(shí)庫(kù) > 對(duì)于ASP編碼問(wèn)題的深入研究與最終解決方案

對(duì)于ASP編碼問(wèn)題的深入研究與最終解決方案

熱門標(biāo)簽:寧夏怎么申請(qǐng)400電話 企數(shù)外呼系統(tǒng)能用多久 咸陽(yáng)銷售外呼系統(tǒng) 辦理400電話一年多少錢 蘭州智能語(yǔ)音電銷機(jī)器人功能 常用地圖標(biāo)注范圍點(diǎn) 離線電子地圖標(biāo)注軟件注冊(cè) 為什么外呼系統(tǒng)需要預(yù)存話費(fèi)呢 外呼回?fù)芟到y(tǒng)圖片

ASP亂碼確實(shí)棘手,這個(gè)說(shuō)明比較權(quán)威。有待研究。哪的資料都不如官方資料權(quán)威。今天總算從MSDN中擇出了ASP編碼問(wèn)題的解決方案。
... ASP亂碼確實(shí)棘手,這個(gè)說(shuō)明比較權(quán)威。有待研究。

哪的資料都不如官方資料權(quán)威。今天總算從MSDN中擇出了ASP編碼問(wèn)題的解決方案。

下面是MSDN中的一段話。

Setting @CODEPAGE explicitly affects literal strings in a single response. Response.CodePage affects dynamic strings in a single response, and Session.CodePage affects dynamic strings in all responses in a session.

這句話解釋清楚了@CODEPAGE,Response.CodePage,Session.CodePage 分別的作用是什么。

@CODEPAGE作用于所有靜態(tài)的字符串,比如某文件中的 const blogname="我的家"

Response.CodePage,Session.CodePage作用于所有動(dòng)態(tài)輸出的字符串,比如%=blogname%>

這句話很關(guān)鍵的是說(shuō)明了Response.CodePage的作用范圍是a single response,而SXNA中聲明的Session.CodePage的作用范圍是all responses in a session。

再看另外一句話。

If Response.CodePage is not explicitly set in a page, it is implicitly set by Session.CodePage, if sessions are enabled. If sessions are not enabled, Response.CodePage is set by @CodePage, if @CodePage is present in the page. If there is no @CodePage in the page, Response.CodePage is set by the AspCodePage metabase property. If the AspCodePage metabase property is not set, or set to 0, Response.CodePage is set by the system ANSI code page.

這句話我乍一看,把意思理解成了這樣:在sessions are enabled的時(shí)候,如果Response.CodePage沒(méi)有聲明,則Response.CodePage會(huì)被Session.CodePage賦值。如果sessions are not enabled的時(shí)候, 如果@CodePage已聲明,則Response.CodePage會(huì)被@CodePage賦值,等等.............

這句話解釋了為什么從SXNA中出來(lái)以后進(jìn)入一些別的頁(yè)面比如oblog,z-blog等等容易出現(xiàn)亂碼,因?yàn)槠渌绦驔](méi)有聲明Response.CodePage而恰巧SXNA聲明了Session.CodePage,因此一進(jìn)入SXNA,Session.CodePage立即被賦值(版本不同,有的版本賦了936有的版本賦了65001),而后進(jìn)入其他程序的時(shí)候Response.CodePage馬上被Session.CodePage賦值,如果這時(shí)Response.CodePage與頁(yè)面本身編碼不一樣的話,頁(yè)面就會(huì)出現(xiàn)亂碼。所以進(jìn)入z-blog出現(xiàn)亂碼的時(shí)候我查了當(dāng)時(shí)的Session.CodePage和Response.CodePage都是936,而進(jìn)入oblog出現(xiàn)亂碼的時(shí)候Session.CodePage和Response.CodePage都是65001.就是說(shuō)要想保證葉面不出現(xiàn)亂碼,應(yīng)該聲明Response.CodePage,否則他就會(huì)按照Session.CodePage來(lái)解釋網(wǎng)頁(yè)(而不是按照@codepage解釋網(wǎng)頁(yè)).

如果僅僅按照上面的解釋的話,我實(shí)際上是很糊涂的,因?yàn)槲覀兌际怯玫闹形牟傧到y(tǒng),當(dāng)每一次進(jìn)入瀏覽器的時(shí)候你可以嘗試輸出Session.CodePage,能看到他都是936!為什么進(jìn)入Z-blog的時(shí)候他不把默認(rèn)的Session.CodePage的936賦給Response.CodePage呢?反而把@CodePage給了Response.CodePage?什么情況下Session.CodePage才賦值給Response.CodePage呢?原文的sessions are enabled應(yīng)該如何理解呢?

也許上面的話應(yīng)該這樣理解:

在Session.CodePage任何程序聲明的時(shí)候,如果Response.CodePage沒(méi)有聲明,則Response.CodePage會(huì)被Session.CodePage賦值。如果Session.CodePage沒(méi)有被任何程序聲明的時(shí)候, 如果@CodePage已聲明,則Response.CodePage會(huì)被@CodePage賦值,....,最后的頁(yè)面動(dòng)態(tài)內(nèi)容部分按照Response.CodePage的值解釋。

因?yàn)閆blog和Oblog都聲明了@CodePage,所以,用戶剛剛啟動(dòng)完機(jī)器然后進(jìn)入瀏覽器瀏覽Zblog和Oblog的時(shí)候Response.CodePage會(huì)被@CodePage賦值,于是葉面顯示正常。

這句話進(jìn)一步解釋了產(chǎn)生亂碼的原因

If you set Response.CodePage or Session.CodePage explicitly, do so before sending non-literal strings to the client. If you use literal and non-literal strings in the same page, make sure the code page of @CODEPAGE matches the code page of Response.CodePage, or the literal strings are encoded differently from the non-literal strings and display incorrectly.

其中比較有用的一句話是說(shuō)如果Response.CodePage@CODEPAGE不一樣的話會(huì)產(chǎn)生亂碼。也就是說(shuō)當(dāng)Z-blog的@CODEPAGE=65001而Z-blog的Response.CodePage被Session.CodePage賦為936的時(shí)候就會(huì)出現(xiàn)亂碼,oblog反之亦然。

不知道上面說(shuō)了這么多解釋清楚沒(méi)有-_-||

下面解釋一下為什么SXNA有時(shí)會(huì)把Session.CodePage賦為936,我有一個(gè)版本是這樣寫(xiě)的:

% OriginalCodePage=Session.CodePage %>

.......

% Session.CodePage=OriginalCodePage %>

當(dāng)用戶進(jìn)入瀏覽器的時(shí)候Session.CodePage默認(rèn)為936,這個(gè)時(shí)候的默認(rèn)936不是程序聲明的,因此不會(huì)賦給Response.CodePage,當(dāng)進(jìn)入SXNA的時(shí)候,Session.CodePage被上面那段代碼一折騰就變成了程序聲明的Session.CodePage=936,因此再進(jìn)入Zblog的時(shí)候就把936給了Response.CodePage。

至此,全部原因已經(jīng)分析清楚了。

因此說(shuō),保證asp葉面一定不會(huì)出現(xiàn)亂碼的代碼應(yīng)該是這樣的:(假定是UTF-8的葉子)

%@ CODEPAGE=65001 %>

% Response.CodePage=65001%>

% Response.Charset="UTF-8" %>

進(jìn)一步說(shuō)明為什么要加Response.Charset,因?yàn)镸SDN說(shuō)應(yīng)該加...呵呵

If the code page is set in a page, then Response.Charset should also be set.

另外,文件的編碼格式應(yīng)該與@CODEPAGE一樣:

The file format of a Web page must be the same as the @CODEPAGE used in the page.

這就是為什么zblog,pjblog等一些程序要吧文件存成UTF8編碼格式的原因.

綜上,如果所有的程序都聲明了Response.CodePage就不會(huì)被Session.CodePage干擾而出現(xiàn)亂碼了。所以Session.CodePage還是不能輕易用的!

 

參考文章:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iissdk/html/268f1db1-9a36-4591-956b-d7269aeadcb0.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iissdk/html/582e6f47-52eb-413e-8b5d-c99145cb61d8.asp

您可能感興趣的文章:
  • Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫(kù)優(yōu)化分字訣上 分庫(kù)
  • Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫(kù)優(yōu)化 分字訣 分表(縱向拆分,橫向分區(qū))
  • Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫(kù)優(yōu)化措施 使用主從庫(kù)(全)
  • asp.net下數(shù)據(jù)庫(kù)操作優(yōu)化一例
  • asp.net小談網(wǎng)站性能優(yōu)化
  • Asp.net 網(wǎng)站性能優(yōu)化二則分享
  • ASP.NET性能優(yōu)化之讓瀏覽器緩存動(dòng)態(tài)網(wǎng)頁(yè)的方法
  • ASP.NET性能優(yōu)化之減少請(qǐng)求
  • asp.net程序優(yōu)化 盡量減少數(shù)據(jù)庫(kù)連接操作
  • Asp.Net性能優(yōu)化技巧匯總
  • Asp編碼優(yōu)化技巧

標(biāo)簽:泰州 鐵嶺 溫州 家電維修 咸陽(yáng) 昆明 昌都 麗江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《對(duì)于ASP編碼問(wèn)題的深入研究與最終解決方案》,本文關(guān)鍵詞  對(duì)于,ASP,編碼,問(wèn),題的,深入研究,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《對(duì)于ASP編碼問(wèn)題的深入研究與最終解決方案》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于對(duì)于ASP編碼問(wèn)題的深入研究與最終解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章