GB2312是簡體中文的編碼,所以當文章/網頁中包含繁體中文、日文、韓文時,這些內容可能無法被正確編碼。
有壹種比GB2312編碼略廣的編碼,就是GBK,它包含了對繁體中文的編碼,但對他國非拉丁字母語言還是有問題。
UTF-8編碼是壹種目前廣泛應用於網頁的編碼,它其實是壹種Unicode編碼,即致力於把全球所有語言納入壹個統壹的編碼。目前UTF-8已經把幾種重要的亞洲語言納入,包括簡繁中文和日韓文字。采用UTF-8編碼的網頁某種意義上說就是“與國際接軌”了。此外,很多手機終端都使用UTF-8編碼,如果網站考慮開發WAP界面而網站數據本身又是UTF-8編碼,就省卻了開發WAP界面時的轉碼問題。
已有的網站是GB2312編碼?看到UTF-8編碼有點心動?本文就是教妳如何把網站從GB2312轉為UTF-8。
在轉換前,必須考慮網站是否有必要轉碼。我提供幾點供參考:
1、網站面向的對象,是局限壹小圈子的人,還是中國大陸,還是包括港澳臺在內的整個中國甚至全世界。
2、在GB2312編碼中壹個漢字占2個字節,而在UTF-8中,壹個漢字要占3個字節,這種空間增加的代價是否值得。
3、在舊有的數據庫系統上(例如mysql 4.0及以前的版本)可能沒有內置對UTF-8的支持,雖然本文有辦法解決,但不排除還潛在壹些小問題。
4、網頁文件轉為UTF-8編碼後是否方便編輯。我目前用ZDE4,設置好後對UTF-8編碼支持非常好。設置方法是在菜單Tools->Preferences中,點Editing標簽,把Encoding改為UTF-8即可。
考慮好決定轉碼以後,就可以開始了。本文僅以PHP 4.0~5.0 + MySQL 3.23~4.0為例。
首先對準備轉碼的數據庫,為其建立壹個新的數據庫及相應表結構用於存儲轉碼結果。如果在沒有內置支持UTF-8的數據庫系統操作,則建議把用於存儲中文的CHAR、VARCHAR、TEXT字段分別改為BINARY、VARBINARY、BLOB,雖然我試驗過不改也沒有問題。
接著在操作系統命令行下執行如下命令導出原有的數據庫(其中{dbname}用數據庫名替換,{path1}用壹個已存在的臨時路徑替換,導出的數據將會存放於此):
mysqldump --opt --comments=0 -n -t --fields-terminated-by=, --fields-escaped-by=\ {dbname} -uroot -p --tab={path1}
上述命令中的用戶root也可換為其它用戶,但須保證有dump的權限。用轉碼工具,例如ConvertZ,把上面{path1}中的全部文件轉為UTF-8編碼。註意要關閉BOM選項。假設轉碼後的文件保存在路徑{path2}。
用有LOAD DATA權限的用戶連接MySQL服務器,用use命令選擇剛才新建的數據庫,然後對每個表{table_name}執行如下命令:
LOAD DATA INFILE '{path2}{table_name}.txt' INTO TABLE {table_name} FIELDS TERMINATED BY ',' ESCAPED BY '\';
提示:表比較多的時候可以寫個小程序生成壹個SQL腳本。
執行上述命令時可能會出現警告(Warnings),請留意Warning的這些行(Row),可能有些數據並沒有轉換成功,例如字段錯位。
根據經驗,此種情況多數是由數據結尾的字節的16進制碼大於7F所致。通常這些行數量是比較少的,可以手工修正這些行。
至此數據庫的轉碼就完成了。清理原數據庫和轉碼過程的臨時文件這裏就不詳述了。
對網頁轉碼:同樣用轉碼工具把網站所有網頁轉為UTF-8編碼。
然後打開包含頭部的網頁文件/網頁模版文件,把這樣的行:
替換為這樣:
據我的經驗,如果網頁采用Css樣式表控制網頁樣式,如果在css的body標簽中設置了字體,那麽在原來的gb2312編碼下,該字體設置可以繼承到intput和textarea中,但轉為utf-8後,需要在input和textarea標簽中重新設置字體。