作者 主題: phpBB 轉換成 utf8  (閱讀 6615 次)

0 會員 與 1 訪客 正在閱讀本文。

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
phpBB 轉換成 utf8
« 於: 2006-05-22 19:36 »
參考資料如下

1.  phpBB 由 BIG5 轉換到 UTF-8
http://blog.teatime.com.tw/post/1/48

2. 下載 AppServ 2.5.5 版
http://www.appservnetwork.com/

3. 下載新版的 phpBB 竹貓星球
http://phpbb-tw.net/phpbb/

4. 解決安裝phpBB 2.0.19 UTF-8 版的亂碼問題
http://service.url.com.tw/web_hosting/program/phpbb_2019_utf8.php

我原本的的環境如下,AppServ 2.4.4a , 內含的mysql 是 4.0.x 版, phpBB是
 2.0.18 (Big5)版,由於預設 AppServ 安裝時 MySql 是使用 latin1 編碼,當使用
mysqldump 匯出資料庫時在某些中文字後會有\ ( 例如:許,功,過等),在要匯入
資料時會發生問題,在網路上找了很多的資料後,發現用下列方式,可以很方便的
將整個phpbb 的環境改為utf8

先利用 [1] 提到的文章內提供的script (最後面轉換資料庫的部份),設定好須要
的資料(主機位置,資料庫名稱,帳號,密碼等),執行 script 會將舊有的資料庫轉出
存成 utf8.sql 檔

利用 \AppServ\php\php.exe \存放路徑\utf8.php 來產生 \存放路徑\utf8.sql 檔

utf8.php
代碼: [選擇]

<?php

set_time_limit
&#40;0&#41;;

$phpname 'phpbb_';
$dbuser 'dbuser';
$dbpass 'dbpass';
$dbhost 'localhost';
$dbname 'dbname';

$encoding_cnt 0;
$encoding[$encoding_cnt++&#93; = 'BIG5';
$encoding[$encoding_cnt++&#93; = 'GB2312';
$encoding[$encoding_cnt++&#93; = 'GBK';
$encoding[$encoding_cnt++&#93; = 'SHIFT_JIS';
$encoding[$encoding_cnt++&#93; = 'GB18030';

$conn mysql_connect&#40;$dbhost, $dbuser, $dbpass&#41;;
if &#40;!$conn&#41; &#123;
    
echo "Can't connect to mysql at $dbhost!";
    exit;
&
#125;

if &#40;!mysql_select_db&#40;$dbname, $conn&#41;&#41; &#123;
    
echo "Can't use database $dbname!";
    
mysql_close&#40;$conn&#41;;
    
exit;
&
#125;

//mysql_query&#40;"SET NAMES 'big5'", $conn&#41;;
if &#40;!&#40;$result = mysql_list_tables&#40;$dbname, $conn&#41;&#41;&#41; &#123;
    
echo "Can't get table for $dbname!";
    
mysql_close&#40;$conn&#41;;
    
exit;
&
#125;
while &#40;$row = mysql_fetch_row&#40;$result&#41;&#41;
    
$tables[&#93; = $row[0&#93;;
mysql_free_result&#40;$result&#41;;

$fp fopen&#40;"utf8.sql", "wt"&#41;;
if &#40;$fp == 0&#41; &#123;
    
echo "Can't open utf8.sql!";
    
mysql_close&#40;$conn&#41;;
    
exit;
&
#125;

fputs&#40;$fp, "SET NAMES 'utf8';\n"&#41;;

$cnt 0;
foreach &
#40;$tables as $tblname&#41; &#123;
    
$cnt++;
    if &
#40;$tblname == $phpname.'search_wordlist' ||
        
$tblname == $phpname.'search_results' ||
        
$tblname == $phpname.'search_wordmatch'&#41; &#123;
        
echo "skip for $tblname<br>\n";
        continue;
    &
#125;
    
fputs&#40;$fp, "delete from `$tblname`;\n"&#41;;
    
echo "Table&#58; $tblname<br>\n";
    echo 
"<blockquote>\n";
    
$sql "select * from `$tblname`";
    
$result mysql_query&#40;$sql, $conn&#41;;
    
if &#40;!$result&#41; &#123;
        
echo "Query failed&#58; $sql\n";
    &
#125;
    
else &#123;
        
$fields = array&#40;&#41;;
        
$num mysql_num_fields&#40;$result&#41;;
        
for &#40;$i = 0; $i < $num; $i++&#41; &#123;
            
$meta mysql_fetch_field&#40;$result&#41;;
            
if &#40;!$meta&#41; &#123;
                
echo "No meta information!\n";
            &
#125;
            
else &#123;
                
$name $meta->name;
                
$type $meta->type;
                echo 
"'$name' => '$type'<br>\n";
                
$fields[$i&#93;['name'&#93; = $name;
                
$fields[$i&#93;['type'&#93; = $type;
            
&#125;
        
&#125;
        
$row_cnt 0;
        
$err 0;
        while &
#40;$row = mysql_fetch_row&#40;$result&#41;&#41; &#123;
            
$row_cnt++;
            
$field_list '';
            
$value_list '';
            
$id $row[0&#93;;
            
for &#40;$i = 0; $i < $num; $i++&#41; &#123;
                
$type $fields[$i&#93;['type'&#93;;
                
$value $row[$i&#93;;
                
if &#40;$value == NULL&#41; continue;
                
if &#40;$field_list == ''&#41; &#123;
                    
$field_list '`'.$fields[$i&#93;['name'&#93;.'`';
                
&#125;
                
else &#123;
                    
$field_list .= ',`'.$fields[$i&#93;['name'&#93;.'`';
                
&#125;
                
if &#40;$type == 'string' || $type == 'blob'&#41; &#123;
                    
$lines explode&#40;"\n", $value&#41;;
                    
$n count&#40;$lines&#41;;
                    
$uvalue '';
                    for &
#40;$ln = 0; $ln < $n; $ln++&#41; &#123;
                        
$xline $lines[$ln&#93;;
                        
$ok 0;
                        for &
#40;$x = 0; $x < $encoding_cnt; $x++&#41; &#123;
                            
$code $encoding[$x&#93;;
                            // I think we should remove //TRANSLIT here, return error to change another encoding
                            //$xvalue = iconv&#40;$code, 'UTF-8//TRANSLIT', $xline&#41;;
                            
$xvalue iconv&#40;$code, 'UTF-8', $xline&#41;;
                            
if &#40;$xvalue === false&#41; &#123;
                                //echo "$id, Can't convert $xline from $code<br>\n";
                            
&#125;
                            
else &#123;
                                //echo "convert '$xline' to '$xvalue' for $code<br>\n";
                                
$ok 1;
                                break;
                            &
#125;
                        
&#125;
                        
if &#40;$ok == 0&#41; &#123;
                            
$xvalue $xline;
                            
//echo "failed for all encoding<br>\n";
                        
&#125;
                        
if &#40;$ln == 0&#41;
                            
$uvalue $xvalue;
                        else
                            
$uvalue .= "\n".$xvalue;
                    &
#125;
                    
if &#40;preg_match&#40;"/&amp;#\d&#123;4,7&#125;;&#123;0,1&#125;/", $uvalue&#41;&#41; &#123;
                        
$x preg_replace_callback&#40;
                            
"|&#40;&amp;#&#41;&#40;\d&#123;4,7&#125;&#41;&#40;;&#123;0,1&#125;&#41;|",
                            
"num2utf",
                            
$uvalue&#41;;
                        //echo "convert '$uvalue' to '$x'<br>\n";
                        
$uvalue $x;
                    &
#125;
                    
$str mysql_escape_string&#40;$uvalue&#41;;
                    
if &#40;$value_list == ''&#41; &#123;
                        
$value_list "'$str'";
                    &
#125;
                    
else &#123;
                        
$value_list .= ",'$str'";
                    &
#125;
                
&#125;
                
else &#123;
                    
if &#40;$value_list == ''&#41; &#123;
                        
$value_list $value;
                    &
#125;
                    
else &#123;
                        
$value_list .= ",$value";
                    &
#125;
                
&#125;
            
&#125;
            
$sql "insert into $tblname &#40;$field_list&#41; values &#40;$value_list&#41;";
            
fputs&#40;$fp, $sql&#41;;
            
fputs&#40;$fp, ";\n"&#41;;
        
&#125;
    
&#125;
    
echo "</blockquote>\n";
&
#125;

fclose&#40;$fp&#41;;
mysql_close&#40;$conn&#41;;

function code2utf&#40;$num&#41;
&#123;
    //Returns the utf string corresponding to the unicode value
    //courtesy - romans@void.lv
    
if &#40;$num<128&#41;
        
return chr&#40;$num&#41;;
    
if &#40;$num<2048&#41;
        
return chr&#40;&#40;$num>>6&#41;+192&#41;.chr&#40;&#40;$num&63&#41;+128&#41;;
    
if  &#40;$num<65536&#41;
        
return chr&#40;&#40;$num>>12&#41;+224&#41;.chr&#40;&#40;&#40;$num>>6&#41;&63&#41;+128&#41;.chr&#40;&#40;$num&63&#41;+128&#41;;
    
if &#40;$num<2097152&#41;
        
return chr&#40;&#40;$num>>18&#41;+240&#41;.chr&#40;&#40;&#40;$num>>12&#41;&63&#41;+128&#41;.chr&#40;&#40;&#40;$num>>6&#41;&63&#41;+128&#41;. chr&#40;&#40;$num&63&#41;+128&#41;;
    
return '';
&
#125;

// the callback function
function num2utf&#40;$matches&#41; &#123;
   // as usual&#58; $matches[0&#93; is the complete match
   // $matches[1&#93; the match for the first subpattern
   // enclosed in '&#40;...&#41;' and so on
   
$code $matches[2&#93;;
   
return code2utf&#40;$code&#41;;
&#125;

?>



再將原來的 AppServ 移除 (請先自行備份),由[2}下載安裝新版的AppServ
(我是安裝2.5.5) 在安裝到MySql 時請注意編碼的選擇,預設為 latin1 , 請自行
輸入 utf8 , 改用utf8 編碼,

到 [3] 下載新版的 phpBB 利用 utf8 編碼的版本,安裝好phpBB後(請自行參考
安裝文件),應該就可以看到預設的 phpBB 網頁, 再利用下列指令匯入舊的資料
 mysql -u root phpbb2 < utf8.sql , 就會匯入舊的資料,但是可能會發現有中文
的地方會變成亂碼,但是討論區的版面是正常的,請不用緊張

參考 [4] 的資料修改 phpBB/db/mysql4.php 在第49行加入,也就是在
if( $this->db_connect_id ) 之前
代碼: [選擇]
@mysql_query("SET NAMES utf8",
$this->db_connect_id);

即會顯示正常的中文,或是在安裝phpBB前就先設定好mysql4.php