24h購物| | PChome| 登入
2010-05-07 15:57:09| 人氣20,071| 回應3 | 上一篇 | 下一篇

[asp]讓你知道codepage的重要

推薦 0 收藏 0 轉貼0 訂閱站台

看到兩個重點:
1. charset
<METAhttp-equiv="Content-Type" content="text/html;charset=big5">

是將表單資訊編碼用的, 編為指定的碼後再傳給伺服器使用, 或將伺服器傳來的資料編碼後顯示

2. codepage
<%@ codepage=950%>


是指定IIS要用什麼編碼讀取傳過來的網頁資料, 也就指定了從資料庫 取出的資料從Unicode轉換到的編碼
<%@ codepage=936%>簡體中文
<%@ codepage=950%>
繁體中文

<%@ codepage=65001%>UTF-8


資料來源:BlueIdea

這幾天研究UTF-8編碼,太暈了,把我的看法和各位討論討論。

歡迎來批啊。以下都是我的想法,哪裡有不對的請不吝賜教,幫忙指出來。

 相關的題外話:

 一、作業系統

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--Unicodecharset轉換到對應編碼()--表單發送編碼

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

 伺服器端:讀取資料庫的Unicode資料,轉換到codepage指定編碼---生成原始程式碼--IEcharset讀取顯示。

 下麵舉例說明:

例一:

假設有三個asp頁面,典型的留言頁面:

1.write.asp 簡單的輸入表單,提交到add.asp

<METAhttp-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裡會顯示什麼樣?

是不是暈了。讓我們從頭分析。



1.bmp



例二:

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



2.bmp

到這裡發現了什麼?
1
.如果輸入的文字和Charset對應的不同,一轉換,就可能出現Unicode形式的字了。這裡就是原因所在。以後 整個過程都保留著。
2
.Add.asp裡codepage決定了保存到資料庫的文字,用的是哪個語言對應的Unicode.

codepage=936,那麼資料庫保存的就是簡體中文的Unicode(資料庫拿回簡體中文系統,一切正常的),codepage=950 保存的就是繁體中文的Unicode.(拿回簡體中文系統,就不對了)。

3.注意一下串串的變化過程:

1)輸入法---CharsetUnicode----指定字元集的映射
2)Charset----
表單編碼串串簡單編碼
3)
表單 解碼上步的逆過程,兩步抵消了。
4)
串串àcodepage讀取串串沒變,這步有可能誤會讀取
5)
轉為對應的Unicode Codepage指定字元集----Unicode映射
6)
中間處理,進資料庫無變化,直接以Unicode形式進入
7)
codepage讀取資料庫Unicode----codepage指定字元集的映射
8)
顯示,按Charset指定字元集讀取串串沒變。

以例一說明:



3.bmp


例二:



4.bmp

暈了。現在來用用知識。

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



5.bmp

 案例二:
簡體中文的代碼和資料,想轉為完全的繁體版,該怎麼辦?
分析:1。代碼檔編碼全部改 為Big5的,檔本身保存編碼選繁體。
2
<%@ codepage=936 %>
3.Charset=big5
4.access
版本無所謂,因為access裡的資料是Unicode的。
5.
好了,代碼可以在純繁體系統下跑了。
6.
遺留問題:原有的簡體中文資料讀 出會有一些問號。效果同例一的950讀取,big5顯示。因為從簡體中文的Unicode轉換到繁體中文了,有些字繁體中沒有,就會出問號。
7.
解決:用一個臨時asp頁,codepage=65001,讀出為簡體中文的Unicode,用一個Unicode->Big5的函數,轉為繁體中 文,然後寫回資料庫,應該行了吧?

兩個案例完全是我按照理論推導出來了,未經證實。
有類似經歷的歡迎批評指正。

論壇的相關討論:http://www.blueidea.com/bbs/NewsDetail.asp?id=1831362

台長: nut
人氣(20,071) | 回應(3)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 技術 |
此分類下一篇:踢掉 Windows server 遠端桌面使用者
此分類上一篇:網站繁簡體轉換(二)

阿宏
你的研究結果很多,真的需要一點時間消化,不過很詳細,有空回來研究研究..有趣
2011-03-03 05:51:49
justin
也是遇到為何要指定codepage及charset
版本的解說加圖說很詳細 很感謝
看完雖然沒辦法完全看懂
不過,已經大概知道page跟web server之間的code轉換
感謝版主...
2012-04-19 12:23:43
春藥
很讚的分享~~~


http://www.yyj.tw/
2020-01-10 05:35:54
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文