Visual Studio utf-8 代碼 中文亂碼完全解決方案

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 方式保存並可以正常瀏覽了。下面爲該網頁編寫按鈕相應代碼:


運行網頁,點擊 Submit,再次出現亂碼!

 

更詭異的是,如果在 VS 的調試器裏看的話都是好的。查閱相關資料可以發現如下線索:asp.net 的源代碼編譯之後的編碼方式是和源文件本身的編碼方式相同。因此,爲了讓源代碼裏的字符串也可以正常顯示和處理,需要把源文件的存儲方式也改成 utf-8,這次用 VS 或 UltraEdit 直接另存爲 utf-8 格式即可,記得順便選上帶 BOM 的保存。這樣,網頁的顯示就完全正常了。

總結

如果在中文 asp.net 中使用 utf-8 編碼,需要做到以下幾點:

  1. html 代碼中要加入定義文件編碼的

    <meta>

    標記

  2. .aspx 文件 和對應的源代碼文件的物理保存格式需要轉化爲 utf-8
  3. 建議在代碼文件加入 BOM 頭標記,明確指出其物理格式
  4. 在 web.config文件中指明站點編碼,可以在一定程度上避免中文亂碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章