2012-02-01 85 views
3

我試圖從一個定製的CMS使用latin1字符集將一些魚物種信息配置文件移至使用UTF-8的WordPress自定義(自定義帖子類型,具有多個元字段)數據庫。將數據從latin1字符集遷移到UTF-8

最重要的是,舊的CMS使用一些奇數的bbCode位。

基本上,我正在尋找一個功能,將做到這一點:

  • 從我的舊數據庫中獲取信息與latin1_swedish_ci整理(和latin1字符集)
  • 轉換所有非標準的字符(我們擁有包括克羅地亞語,捷克語,西班牙語,法語和德語在內的各種語言的字符到HTML實體,如á(數字如&134;也很好)。
  • 轉換所有BB代碼(見下文),以HTML
  • 轉換'"爲HTML實體
  • 返回與utf-8字符集的信息,我的新的數據庫

BB代碼tofrom是:

$search = array('[i]', '[/i]', '[b]', '[/b]', '[pl]', '[/pl]'); 
$replace = array('<i>', '</i>', '<strong>', '</strong>', '', ''); 

,我到目前爲止已經試過的功能是:

$search = array('[i]', '[/i]', '[b]', '[/b]', '[pl]', '[/pl]'); 
$replace = array('<i>', '</i>', '<strong>', '</strong>', '', ''); 

function _convert($content) { 
    if(!mb_check_encoding($content, 'UTF-8') 
     OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32'))) { 

     $content = mb_convert_encoding($content, 'UTF-8'); 

     if (mb_check_encoding($content, 'UTF-8')) { 
      return $content; 
     } else { 
      echo "<p>Couldn't convert to UTF-8.</p>"; 
     } 
    } 
} 

function _clean($content) { 
    $content = _convert($content); 
    /* edited out because otherwise all HTML appears as &lt;html&gt; rather than <html> 
    //$content = htmlentities($content, ENT_QUOTES, "UTF-8"); 
    $content = str_replace($search, $replace, $content); 

    return $content; 
} 

但是,這阻止了一些字段被導入到新的數據庫,並且不會取代bbCode。

如果我使用下面的代碼,它主要作品:

$var = str_replace($search, $replace, htmlentities($row["var"], ENT_QUOTES, "UTF-8"));

然而,含有一定的領域是什麼,我認爲是捷克/克羅地亞的字符不會出現在所有。

有沒有人有任何建議,我可以按照上面列出的順序成功地將信息從「舊格式」轉換爲新的?

+1

從latin1轉換到'&134;'並不完全是「使用UTF-8」。爲什麼這個而不是真正的UTF-8? – deceze 2012-02-01 00:50:00

+0

我必須承認,我並不知道任何關於charsets的知識或瞭解他們的工作方式。這篇文章背後的「關鍵事實」基本上是這樣的:當我遷移到我的新數據庫時,某些字段沒有被WordPress識別。當我減少這個問題時,我發現它是導致問題的非標準字符。進一步研究,我推測 - 在這篇文章的指導下[http://wordpress.stackexchange.com/questions/40770/problem-with-serialized-arrays-in-custom-meta] - 這將是因爲字符集差異。 – dunc 2012-02-01 11:10:00

回答

2

我會說如果你想轉換所有的非ASCII字符,你將不需要做任何latin1轉換爲UTF-8轉換是如此之多。假設您對數據運行諸如htmlspecialcharshtmlentities之類的函數,則所有非ASCII字符都將替換爲其相應的實體代碼。

基本上,在這一步之後,不應該有任何需要轉換爲UTF-8的字符。此外,如果您想將latin1編碼字符串轉換爲UTF-8,我強烈懷疑utf8_encode會很好。

PS。當將bbCode轉換爲HTML時,我建議使用正則表達式代替。例如,你可以這樣做:

$html_data = preg_replace('/\[(/?[a-z]+)\]/i', '<$1>', $bb_code_data);