關於??亂碼,是系統相關的各個環節之間進行代碼轉換出現的問題,比如在shell下用MySQL這個程序對數據庫進行恢復,MySQL會錯誤的把代碼進行轉換,導致亂碼出現,
在轉換之前,我們一定要清楚,文件是什麼格式,數據庫內部是什麼格式,都要統一到utf8下來,不對的要進行格式轉換.
1.數據庫的轉換.
以前數據庫裡面的字符,應該都是gb2312格式,這時,需要把所有的數據庫文件導出成sql文本,然後對文本進行utf-8的格式轉換.這裡要注意的是一些2進值的字段內容會出問題.幸好,在我的項目中,2進值內容都進行了base64編碼,如果數據庫中存在2進值的內容,就要對它們進行單獨的處理了.
用mysqldump把數據從MySQL4.0中導出,此時得到的sql文件應該是gb2312的,然後用iconv這個程序把sql文件改為utf8
導出一個MySQL4.0的庫(服務器:192.168.2.2 庫名:dbname):
MySQLdump -h 192.168.2.2 --add-drop-table -c --set-charset=latin1 --allow-keyWords --force -p -u root dbname >1.sql
內容轉換utf8
iconv -c -f gb2312 -t utf8 1.sql -o 2.sql
在導入到4.1之前,先把mysql-server和MySQL-clIEnt設置到utf8模式.
修改/etc/mysq1/my.cnf,在[mysqld]和[MySQL]各增加1行:
[MySQLd]
character_set_server = utf8
[MySQL]
default-character-set =utf8
保證讓服務器端和客戶端都默認工作在utf8模式下,重啟MySQL-server後就可以導入了.
MySQL -u root -h localhost test <2.sql
到這裡,一個數據庫就轉換完成了.已經完全工作在utf8模式下了.
PHP的程序的修改.也可以用iconv程序.進行.
首先從cvs導出一個干淨的代碼拷貝,比如在net目錄下,
cvs -d :pserver:xxx.xxx.xx.xx net co
刪除一些不需要轉換的文件
然後執行轉換
find . -name "*.PHP" -type f -exec mv {} {}.old \; -exec iconv --verbose -f gb2312 -t utf8 {}.old -o {} \; -exec rm {}.old \;
至此,PHP代碼就批量的轉換到utf8模式.還有就是只要修改html的head的語言聲明,從gb2312改成utf8,浏覽器就會自動使用utf8的模式顯示這個頁面. content="text/Html; charset=utf8"
最後,就是把編輯器改成utf8模式了.這個就比較簡單了.
好了,我們的web應用已經進入utf8模式了.哈哈.