您在這裡

煩人的latin1轉utf-8問題

tky's 的頭像
tky 在 2009-08-02 (周日) 19:28 發表

最近在處理一個xoops轉換到Drupal 5.x版本的case,主要先使用xoops_import-5.x-1.1這個模組,把xoops裡頭的user和forum轉進Drupal。
轉換的過程很順利,問題就是說,轉進來的中文變成亂碼。

透過phpmyadmin到資料庫一看才發現,原來xoops的資料庫仍是以latin1編碼,轉進utf8編碼的Drupal自然會是亂碼。
解決辦法的問題,按理說,就是將xoops的資料倒出來,以utf8的編碼匯回資料庫裡頭。
然而麻煩在於,這個xoops的資料在mysql 4.1.22底下看來就已經是亂碼了(應該是因為4.0轉換到4.1的老問題),倒出來的時候也是亂碼一堆。改變編碼然後匯回資料庫裡頭,還是亂碼。
由於只有phpmyadmin的存取權限,tky沒法子透過ssh去下指令,在倒出資料的時候指定預設編碼為latin1。所以無法避免上述的麻煩。

按照https://drupaltaiwan.org/forum/20071116/1658#comment-5121這篇文章的作法,雖然能夠將資料庫的編碼和校對方式改成utf8-general-ci,但亂碼的問題仍未解決。

實在想不到還能怎麼著,請教一下大家先。

tky

http://imil.au.edu.tw/blog1/index.php?itemid=26

修改後, PHPMYADMIN就能看到正常的中文
然後export, 將他們改為utf8, 也將CHARSET改改
再import回就可以

也有些轉換的程式, 試試看 (很舊以前試過一些, 不怎麼好, 手動最快捷)
http://www.google.com.hk/search?hl=zh-TW&num=30&q=mysql+big5+to+utf8&btn...

或者hack drupal也是一個方法 ?

多謝Kay的建議。

本以為可以有簡單的方式來解決這個煩人的問題,但是仍搞了好幾天才搞出一個頭緒。
把TKY的作法寫出來給大家參考一下:

0, 不考慮顯示問題,直接從sql轉碼做起。

1. 因為沒有ssh權限,只能以phpmyadmin到xoops資料庫,以mysql4相容模式倒出xoops.sql檔案

2. 在本機伺服器建立一個latin1_sw連線校對的xoops資料庫,將xoops.sql檔案以big5編碼、mysql4相容模式匯入本機伺服器。

3. 在linux中以終端機下指令轉檔:
#進入mysql目錄 (linux Server):
cd /var/lib/mysql/

#利用mysql自帶的mysqldump功能dump一下原有的latin1編集的數據庫:
mysqldump --user=username --password=password --default-character-set=latin1 --skip-set-charset xoops> xoops.sql

#轉檔:將big5編碼轉為utf8
piconv -f big5 -t utf8 xoops.sql >xoops.utf8.sql

4. 以文字編輯器開啟xoops.utf8.sql,這時候應該可以看到完整的中文。

5. 修改轉檔後的sql檔案
#首先在xoops.utf8.sql檔案的最前端加入以下三行文字
SET NAMES utf8;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;

#再來把每個資料表後面的把CHARSET=latin1改成CHARSET=utf8

#存檔(windows下要注意是否以utf8的方式存檔)

6. 進伺服器的phpmyadmin,將修改過後的dbname.utf8.sql以utf8編碼、mysql4相容模式匯入本機伺服器。

完成!

tky

tky