讓你知道codepage的重要,關於多語言編碼

相關的題外話:
一、操作系統
window系統內部都是unicode的。文件夾名,文件名等都是unicode的,任何語言系統下都能正常顯示。
二、輸入法:
微軟拼音輸出的是Unicode的,智能ABC輸出是簡體中文的(所以智能ABC在非簡體中文系統根本不能用,只能打英文)。
三、網頁的textarea
網頁的textarea是用unicode顯示的。所以往裏打什麼字都能顯示。而一些flash做的輸入框就不行了。
四、Access2000
access裏面保存的數據是unicode的,在任何語言系統下都能顯示。
如果數據視圖查看有些字符不正常,那是因爲顯示所用的字體不是Unicode字體,
換用Arial Unicode MS 字體就能全部顯示了。(access幫助,搜索,輸入unicode,有說明)
五、Word
word裏的繁簡轉換,簡體轉換到繁體後,內碼仍是簡體中文的,其實只是簡體中的繁體字。
六、ASP內部是Unicode的,所有文本都是Unicode存儲的。需要時轉換到指定字符集。
=======================================================
首先說下結論:
<%@ codepage=936%>簡體中文
<%@ codepage=950%>繁體中文
<%@ codepage=65001%>UTF-8

codepage指定了IIS按什麼編碼讀取傳遞過來的串串(表單提交,地址欄傳遞等)。
也指定了所有文本變量從Unicode轉換到的編碼,
也就指定了從數據庫取出的數據從Unicode轉換到的編碼。(注意這個,很重要。)

關鍵字:
讀取:一個串串,按簡體讀取是一些字,按繁體讀取是一些字,串串本身編碼沒有變。
轉換:系統主動的轉換,比如從Unicode的“化”字到Big5的“化”字,內碼變成Big5的。如果Big5沒有對應的字,保留Unicode形式(&#xxxx;)

簡體中文:化六個結論
Unicode16進制形式:&#x5316;&#x516d;&#x4e2a;&#x7ED3;&#x8bba;
Unicode10進制形式:&#21270;&#20845;&#20010;&#32467;&#35770;

下面是我推測出來的編碼轉換的過程:
客戶端:輸入法Unicode--輸入框unicode--從Unicode按charset轉換到對應編碼()--表單發送編碼

服務器端:IIS解開表單編碼--按codepage指定編碼讀取--轉換到對應的Unicode--可以用request("")讀取了--進行一些處理--以Unicode編碼保存到數據庫

服務器端:讀取數據庫的Unicode數據,轉換到codepage指定編碼---生成源代碼--IE按charset讀取顯示。


下面舉例說明:
例一:
假設有三個asp頁面,典型的留言頁面:
1.    write.asp 簡單的輸入表單,提交到add.asp。
<META http-equiv="Content-Type" content="text/html; charset=big5">
2.    add.asp 接收留言,保存到數據庫
<%@ codepage=936%>
3.    read.asp 從數據庫取得留言,顯示。
<%@ codepage=936%> charset=GB2312 或
<%@ codepage=950%> charset=big5

大家可以猜一猜,我在write.asp裏用微軟拼音輸入法輸入“化六個討論”。最後在read.asp裏會顯示什麼樣?
是不是暈了。讓我們從頭分析。



例二:
把例一的add.asp的<%@ codepage=936%>改爲<%@ codepage=950%>,又會怎麼樣呢?



到這裏發現了什麼?
1.如果輸入的文字和Charset對應的不同,一轉換,就可能出現Unicode形式的字了。這裏就是原因所在。以後整個過程都保留着。
2.Add.asp裏codepage決定了保存到數據庫的文字,用的是哪個語言對應的Unicode.如codepage=936,
那麼數據庫保存的就是簡體中文的Unicode(數據庫拿回簡體中文系統,一切正常的),
codepage=950保存的就是繁體中文的Unicode.(拿回簡體中文系統,就不對了)。
3.注意一下串串的變化過程:
--------------------------------------------------------------------
1)    輸入法---Charset    Unicode----指定字符集的映射
2)    Charset----表單編碼    串串簡單編碼
3)    表單解碼    上步的逆過程,兩步抵消了。
4)    串串à按codepage讀取    串串沒變,這步有可能“誤會讀取”
5)    轉爲對應的Unicode    Codepage指定字符集----Unicode映射
6)    中間處理,進數據庫    無變化,直接以Unicode形式進入
7)        
8)    按codepage讀取數據庫     Unicode----codepage指定字符集的映射
9)    顯示,按Charset指定字符集讀取    串串沒變。
-------------------------------------------------------------------------------
以例一說明:


例二:


=============================================
暈了。現在來用用知識。

案例1。
簡體中文系統下跑的好好的代碼,放到國外空間上,數據庫裏亂碼,原有的數據也亂碼。
分析:因爲大多數人平時用的都是簡體中文系統,默認的codepage=936,所以平時大家不寫也沒有關係。
但到了國外空間問題就出來了。從數據庫裏的Unicode轉換到英文編碼去了,所以數據庫原有的簡體中文轉換到英文後,按GB顯示自然亂碼。
如圖,新輸入的文字顯示正常,但數據庫裏保存的是英文的Unicode的。
解決方法:全部加上<%@codepage=936即可%>。
全程只有簡體中文與對應Unicode間的轉換。



案例二:
簡體中文的代碼和數據,想轉爲完全的繁體版,該怎麼辦?
分析:1。代碼文件編碼全部改爲Big5的,文件本身保存編碼選繁體。
2.<%@ codepage=936 %>
3.Charset=big5
4.access版本無所謂,因爲access裏的數據是Unicode的。
5.好了,代碼可以在純繁體系統下跑了。
6.遺留問題:原有的簡體中文數據讀出會有一些問號。效果同例一的950讀取,big5顯示。因爲從簡體中文的Unicode轉換到繁體中文了,有些字繁體中沒有,就會出問號。
7.解決:用一個臨時asp頁,codepage=65001,讀出爲簡體中文的Unicode,用一個Unicode->Big5的函數,轉爲繁體中文,然後寫回數據庫,應該行了吧?
案例三:
簡體中文的代碼和數據庫,想轉爲完全的UTF-8版,怎麼辦?
分析:1。代碼文件編碼全部改爲UTF-8的,文件本身保存編碼選UTF8。
2.<%@ codepage=65001 %>
3.Charset=UTF-8
4.access版本無所謂,因爲access裏的數據是Unicode的。
5.OK,沒有任何遺留問題。原有的簡體中文也會正常顯示。因爲數據庫裏是Unicode的,按Unicode讀出沒有任何轉換。自然不會亂碼。看來轉到UTF-8還是很簡單的。
=============================================
案例完全是我按照理論推導出來了,未經證實。
有類似經歷的歡迎批評指正。
 
1,普通HTML頁面,並聲明此HTML文件是採用gb2312字符集

保存爲文件名:utf1.html,編碼採用ANSI


<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<meta name="author" content="CN-Bruce www.cnbruce.com">;
<title>utf-8</title>
</head>
<body>
調試utf-8代碼
</body>
</html>


IE中瀏覽,字符顯示正常。若選擇瀏覽器菜單“查看”——“編碼”——“除簡體中文以外”,頁面出現亂碼。

2,依然是普通HTML頁面,並聲明此HTML文件是採用gb2312字符集

保存爲文件名:utf2.html,但編碼採用UTF-8


<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<meta name="author" content="CN-Bruce www.cnbruce.com">;
<title>utf-8</title>
</head>
<body>
調試utf-8代碼
</body>
</html>


IE中瀏覽,字符顯示正常。再選擇瀏覽器菜單“查看”——“編碼”——“始終顯示Unicode(UTF-8)”,頁面不出現任何亂碼。

3,同樣是普通HTML頁面,但聲明此HTML文件是採用UTF-8字符集

保存爲文件名:utf3.html,但編碼採用ANSI


<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="author" content="CN-Bruce www.cnbruce.com">;
<title>utf-8</title>
</head>
<body>
調試utf-8代碼
</body>
</html>


IE中瀏覽,字符顯示直接是亂碼。再選擇瀏覽器菜單“查看”——“編碼”——“簡體中文”,頁面方纔正常。

4,繼續是普通HTML頁面,聲明此HTML文件是採用UTF-8字符集

保存爲文件名:utf4.html,並且編碼還是採用UTF-8


<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="author" content="CN-Bruce www.cnbruce.com">;
<title>utf-8</title>
</head>
<body>
調試utf-8代碼
</body>
</html>


IE中瀏覽,字符顯示正常。再選擇瀏覽器菜單“查看”——“編碼”——“始終顯示Unicode(UTF-8)”,頁面不出現任何亂碼。

那麼現在,個人總結得出:從utf2.html和utf4.html比較得,頁面顯示的和文件所採用的字符集並無直接關係,其只是一個聲明作用。真正的主體還是該文件保存時的編碼格式:ANSI or UTF-8

以下是一篇文章參考: www.linuxforum.net/books/UTF-8-Unicode.html
 
發佈了102 篇原創文章 · 獲贊 4 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章