Unicode 編碼正逐漸成為多語言支援的最通用解決方案。採用 Unicode
編碼的中文網頁能在各種平台、各種類的瀏覽器上都得到很好的相容。utf-8 是 Unicode 的一種儲存/交換實現方式。對於不同數值範圍的
Unicode 碼,它採用變長的方式來編碼:所有 ASCII 字元佔用1個位元組,大於 0x7f 的則佔用2到4位元組不等。可以看出,所有
ASCII 檔案直接相容 utf-8。另外,對於網頁原始碼這樣 ASCII 字元占內容很大部分的檔案來說,它通常比其他 Unicode
儲存/交換格式(如utf-16,utf-32等)更節省空間的。因此,utf-8 格式已在網站設計中廣泛的使用。
但是,在 asp.net 中文網頁中使用 utf-8
編碼時,稍不小心就會造成中文亂碼,令人頭疼。對於這個問題,網上很多地方建議:在必要的地方仍使用 GB2312
編碼。這樣顯然不是一個徹底的解決方案。本文討論了如何如何在 asp.net 網站中完全使用 utf-8 編碼。
在 Visual Studio 2005 中建立一個 asp.net 網站。在
web.config 檔案中佈建網站使用 utf-8 編碼:
<?xml
version="1.0"?>...<configuration> <system.web>
<globalization fileEncoding="utf-8" />
</system.web><configuration>...
這樣一來,VS 可以在一定程度上實現對 utf-8
的自動化支援,但不是很完善。經常還是會有亂碼問題。下面的討論在即使沒有佈建網站編碼的情況下依然能有效解決中文亂碼問題。
建立一個 asp.net 頁面,並編寫代碼如下:
<%--sample.aspx--%><%@ Page
Language="C#" AutoEventWireup="true" CodeFile="sample.aspx.cs"
Inherits="sample" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html
xmlns="http://www.w3.org/1999/xhtml"><head runat="server">
<title>測試</title></head><body> <form
id="form1" runat="server"> <asp:RadioButtonList
ID="RadioButtonList1" runat="server"> <asp:ListItem>舊日重來
</asp:ListItem>
<asp:ListItem>http://live.mingliang.org</asp:ListItem>
</asp:RadioButtonList> <asp:Button ID="Button1" runat="server"
Text="Submit" OnClick="Button1_Click" /> <br /> <asp:Label
ID="Label1" runat="server"></asp:Label>
</form></body></html>
Visual
Studio 2005 建立的頁面預設還是 GB2312 編碼,下一步將網頁轉換為 utf-8 編碼。這裡推薦使用 Microsoft
Expression Web
工具。這個軟體的前身就是大名鼎鼎的 Frontpage。在更新為 Expresson Web
之後,它的功能又有了很大的增謙,例如對 css 的加強支援、對 asp.net 控制項甚至是 master page 的完美支援。因此可以說它是和
Visual Studio 2005 配合使用,編輯 asp.net 網頁的首選工具。
在 Expression Web 裡開啟剛才建立的 sample.aspx,在 Design 視圖裡右鍵選 Page
Properties,在 Language 標籤裡將 Save the document as 設定為 Unicode
(UTF-8),確定,儲存。這樣Expression Web 會自動在源檔案裡加上檔案說明編碼的
<meta>
標
簽,並且將硬碟上儲存的檔案自動轉換為 utf-8 格式。
再在 VS 中開啟,居然就產生了亂碼:
這是由於 VS
裡預設不檢測 utf-8 編碼,仍然按照 GB2312 的方式來解釋這個檔案。解決的方法有兩個。一是在 VS 的 tools ->
Options 菜單裡開啟 utf-8 強制檢查:
二是為網頁原始碼加上 BOM (Byte-Order Mark) 標記,作為 Unicode 編碼方式的簽名(推
薦使用
,因為這樣可以保證在任何時候都能正確的檢測檔案編碼)。用 Ultraedit 開啟剛才的 aspx 檔案,點擊 File
-> Save as,在儲存對話方塊中 Format 下拉框裡選擇
UTF-8,以原始檔案名覆蓋儲存即可。此時,在16進位編輯模式下查看可以看到檔案已經被加上了3個位元組的 BOM 標記:
當然,在 VS 的另存新檔對話方塊中點擊 Save 按鈕右邊的下拉式功能表,並以 UTF-8 with signature
方式儲存也可以達到相同效果。
這樣,中文的 asp.net 網頁就已經以 utf-8
方式儲存並可以正常瀏覽了。下面為該網頁編寫按鈕相應代碼:
using System; public partial class sample : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "您選擇的是:" +RadioButtonList1.SelectedValue; } }
運行網頁,點擊 Submit,再次出現亂碼!
更詭異的是,如果在 VS
的調試器裡看的話都是好的。查閱相關資料可以發現如下線索:asp.net
的原始碼編譯之後的編碼方式是和源檔案本身的編碼方式相同。因此,為了讓原始碼裡的字串也可以正常顯示和處理,需要把源檔案的儲存方式也改成
utf-8,這次用 VS 或 UltraEdit 直接另存新檔 utf-8 格式即可,記得順便選上帶 BOM
的儲存。這樣,網頁的顯示就完全正常了。
總結
如果在中文 asp.net 中使用 utf-8 編碼,需要做到以下幾點:
- html
代碼中要加入定義檔案編碼的<meta>
標記
- .aspx 檔案
和對應的原始碼檔案的物理儲存格式需要轉化為 utf-8
- 建議在代碼檔案加入 BOM 頭標記,明確指出其物理格式
- 在
web.config檔案中指明網站編碼,可以在一定程度上避免中文亂碼