1. 程式人生 > >Visual Studio utf-8 程式碼 中文亂碼完全解決方案

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檔案中指明站點編碼,可以在一定程度上避免中文亂碼