2012-02-01 11 views
3

latin1文字セットを使用して、別注CMSからいくつかの魚種情報プロファイルを移動して、UTF-8を使用するWordPressカスタマイズ(カスタム投稿タイプ、多数のメタフィールド付き) 。latin1文字セットからUTF-8へのデータの移行

さらに、古いCMSでは、奇数のbbCodeビットが使用されます。

基本的に、私はこれを行うだろう機能を探しています:

  • latin1_swedish_ci照合(およびlatin1文字セット)と私の古いデータベースからの情報を取り
  • (非標準のすべての文字を変換しますクロアチア語、チェコ語、スペイン語、フランス語、ドイツ語以外の言語の文字をá&134;のような数字も)などのHTMLエンティティに使用しています。
  • BBコードのすべて(下記参照)HTML
  • 私の新しいデータベースにutf-8文字セットとの情報'"戻り
  • HTMLエンティティに変換

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

は「UTF-8を使用して」正確ではありません。なぜこれが実際のUTF-8の代わりになるのですか? – deceze

+0

私は文字セットについて何も知らないか、あるいは彼らが働く方法を理解していることを認めなければなりません。この記事の背後にある「重要な事実」は、基本的にはこれです。新しいデータベースに移行しているときに、WordPressで特定のフィールドが認識されていません。私が問題を解明したとき、それは問題を引き起こしている非標準文字であることが判明しました。さらにそれを見ると、私は、この記事[http://presspress.stackexchange.com/questions/40770/problem-with-serialized-arrays-in-custom-meta]の指針で、文字セットの違い。 – dunc

答えて

2

ASCII以外の文字をすべて変換する場合は、latin1からUTF-8に変換する必要はありません。たとえば、htmlspecialcharshtmlentitiesなどの関数をデータに実行すると、すべての非ASCII文字が対応するエンティティコードに置き換えられます。

基本的には、このステップの後に、変換が必要な文字が残っていてはなりません。UTF-8。また、latin1エンコード文字列をUTF-8に変換したい場合は、utf8_encodeがうまくいくと思われます。

PS。 bbCodeHTMLに変換する場合は、代わりに正規表現を使用することをおすすめします。たとえば、次のような行でそれをすべて行うことができます: `` &134;にlatin1のからの変換

$html_data = preg_replace('/\[(/?[a-z]+)\]/i', '<$1>', $bb_code_data); 
関連する問題