一個字串不指定它使用什麼編碼是沒有意義的。
再也不要假定,“純”文本(plain text)是ASCII.
沒有“純文字”這個東西。
如果你有一個字串,在記憶體中,在檔案中,或者在 Email 訊息裡,你必須知道它的編碼是什麼。否則你無法正確的解釋或者顯示給使用者。
所有的諸如 “我的網頁不能正常顯示了”,或者 ”Email 訊息不能正常顯示了“ 之類的愚蠢問題, 都是因為, 沒有告訴你到底是使用的那種編碼,
UTF-8 還是 ASCII 還是 ISO 8859-1 或者 Windows 1252 ?? 那麼自然無法正常的解釋和顯示,甚至不知道字串該在哪裡結束。
那麼如何保留這樣的編碼標誌,來表示字串的編碼? 有一些基本的辦法。
比如對於 Email 來說,在表單的 header 中加上:
Content-Type:text/plain;charset="UTF-8"
對於 Web 頁面來說,原來的做法是, Web 服務器隨著 web 頁面本身一起,發送一個類似於 Content-Type 的 http header.
(不是在 HTML 裡面,而是作為一個 response header 在 HTML 頁之前發送)
這樣做有一個問題。如果你的 Web 服務器同時有多個網站,網站由多個不同的人用不同的語言開發的程式混在一起。那麼 Web 服務器將無從得知,
每一個檔案是用什麼編碼方式寫的。這樣也就無法發送正確的 Content-Type header.
如果你能夠在每一個 HTML 檔案中記錄 Content-Type 資訊,那麼就很方便了。可這念頭似乎也很瘋狂,因為你還沒有知道用什麼編碼方式去
讀取這個檔案,又怎麼能讀出編碼資訊呢?
幸好,幾乎每一種編碼中,對 32~127 的字元都解釋的相同。所以你可以在每一個 html 檔案中這麼寫:
< html >
< head >
< meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
但是要注意, 這個 meta 標籤必須放在 head 中靠前面的位置才能保證不會出問題。 因為 Web 服務器讀到這裡的時候,就會停止解析,
然後用讀到的這個編碼方式重新解析頁面。
那麼,作為 網頁瀏覽器來說,如果沒有在 meta 標籤中或者 http headers 中發現 Content-Type, 會怎麼樣呢?
IE 是這麼做的:
先嘗試去猜,根據特定的位元組出現在各種語言的典型的編碼中的頻率。
如果編碼設定不正常,使用者可以通過 View|Encoding 菜單來嘗試不同的編碼方式。(當然,不是每個人都知道該這樣做)
在 VB, COM, Windows NT/2000/XP 中,預設的字串類型是 UCS-2(2位元組)的。
在 C++ 代碼中, 我們可以定義字串為 wchar_t(wide char),同時用 wcs 系列的函數代替 str 系列的函數。
如 wcscat, wcslen, 而不是 strcat, strlen.
在 C 代碼中,要建立 UCS-2 字串的話,只要在前面加一個 "L", 如 L"Hello"
對於 Web 頁面,最好統一為使用 UTF-8 編碼。 這個編碼已經被各種 網頁瀏覽器支援了很多年了。
原文地址: http://java.ccidnet.com/art/3737/20060605/571503_1.html