最近公司有一個日文項目,由於之前使用的是自己開發的中文CMS,並沒有將語言包分離,在網站建設調試過程中出現了令人頭疼的亂碼問題。
亂碼出現的原因
由於各個字符編碼的儲存空間不一樣,所以當使用不同的字符讀取數據時,當字符空間過小,就不能正常顯示了。
比如說中文字符的字符集一般是gb2312,如果用utf-8強制讀取改變gb2312的字符,就有可能出現亂碼。因為utf-8的字符集儲存空間大於gb2312,當使用utf-8讀取時,有些字符gb2312的編碼中是不存在的,不存在的字符自然會出現亂碼了。對於靜態文件來說,如果文件的儲存編碼和網頁中編碼設置(charset)不一致的話,由於以上原因就會出現亂碼問題。
以上是對於亂碼問題的簡單分析,在解決現有問題時有涉及到了asp對國際化的支持。
涉及到三個函數:@CODEPAGE,Response.CodePage,Session.CodePage
下面是MSDN中的一段話。
Setting@CODEPAGEexplicitlyaffectsliteralstringsinasingleresponse.Response.CodePageaffectsdynamicstringsinasingleresponse,andSession.CodePageaffectsdynamicstringsinallresponsesinasession.
這三個函數都可以設置asp的編碼,其中@CODEPAGE相當於php中的header,必須在文檔的開始發出。
在中文操作系統的IIS中,默認的為gb2312,參數值是:”936″,而日文需要指定文檔CODEPAGE:
<%@CODEPAGE=932%>
我們使用這個函數來設置文檔編碼具體的使用方法可以參考:http://www.cloudward.net/techLife/article.asp?id=490
現在應該沒有問題了吧?哇,問題仍然存在。考慮到SEO公司的asp程序全部需要生成靜態頁面。而生成的頁面全部是windows默認的ANSI,其中包含日文字符仍然會出現亂碼。這樣我們需要一個asp的函數,生成utf-8或者日文編碼的文件。我們使用以下代碼完成:
SetobjStream=Server.CreateObject(”ADODB.Stream”)
WithobjStream
.Open
.Charset=“utf-8″//編碼,這裡你可以改成任何編碼
.Position=objStream.Size
.WriteText=pencat//pencat為寫入的數據
.SaveToFileserver.mappath(”patch/flilename.html”),2//生成文件路徑
.Close
EndWith
SetobjStream=Nothing
經測試後亂碼的問題解決。