2011-01-09 18 views
3

ギリシャ語のデータベースをutf8に変換しようとしています。この時点で、私は(MySQLを介して、iconv()関数ではなく)それを行う方法を考え出しましたが、私は問題があります。アプリケーションはデータベース内の多くのデータをPHPのシリアル化されたフォーマットで(serialize() 。PHPのシリアル化された文字列をutf8に変換する簡単な方法は?

この形式では、文字列の長さがシリアル化された文字列に格納されます。これは変換後に長さが変わるため(php5がUnicodeを適切にサポートしていないため)、これらの文字列をもうシリアル化できないことを意味します。

これまでのところ、私はこの問題を回避するために、次のいずれかの方法を使用して検討している:

  1. 使用PHP UTF8にこれらの文字列を変換し、全体ではなく、シリアル化された文字列を変換するのは、それをアンシリアライズして変換するために、配列内のすべての項目。
  2. シリアライズされた文字列の長さを再計算するスクリプトを作成します。

オプション2は簡単ですが、これを行うにはもっと早い方法が必要だと思います。おそらく私はこの問題に直面する最初の人ではないので、それらを変換するための自由に利用できるスクリプトさえも。何か案は?

ありがとうございます。

答えて

0

オプション#1はわかりやすく聞こえやすく、エラーが発生しにくいです。

あなたはおそらくアンシリアライズして、CREATE TABLEのSHOWを行い、各文字列

1

に変換を行うために()array_walk_recursive使用し、表のエンコーディングをチェックすることができます。次に、同じエンコーディングでデータベースに接続します(USE 'そのエンコーディング';を実行します)。

ここで、シリアル化された文字列unserialize()を取得します。戻り値は、アプリケーションがserialize()に渡したものになります。

ここに来たら、最初に挿入された文字列(たとえばISO-8859-1、CP1252など)を知る必要があるため、utf-8に変換できます。

あなたのギリシャ語は意図されておらず、utf-8文字列に変換されたので、データベースに戻すことができます。

データを格納するためにシリアル化された文字列を使用しないようにデータベースを再編成することを強くお勧めします。 BLOBSをデータベースに格納する場合は、データベースから移動してファイルシステムに格納することを検討してください。

幸運。

0

これを行うための具体的なコードは次のとおりです。 TODOのキーワードに設定/コードを入力してください:

//TODO: insert your settings here 
$database = 'your_db_name'; 
$table = 'your_table_name'; 
$column = 'column_that_needs_conversion'; 
$primarykey = 'name_of_primary_key_in_that_table'; 

if (mb_internal_encoding() != 'UTF-8') { 
    die('This script must be run in an UTF-8 environment!'); 
} 

$utf8_encode_callback = create_function('&$item,$key', 'if (is_string($item)) $item = utf8_encode($item);'); 

$tablecol = $table .'.'. $column; 
$getvaluesSQL = "SELECT ". $tablecol ." AS thevalue, ". $primarykey ." AS primkey FROM ". $database .".". $table ." WHERE ". $tablecol ." IS NOT NULL AND LENGTH(". $tablecol .") > 0"; 

//TODO: insert code here for executing $getvaluesSQL against your database 

if (mysqli_num_rows($db_getvalues) > 0) { 
    while ($getvalues = mysqli_fetch_assoc($db_getvalues)) { 
     $php = unserialize(utf8_decode($getvalues['thevalue'])); 

     if (is_array($php)) { 
      array_walk_recursive($php, $utf8_encode_callback); 
     } elseif (is_string($php)) { 
      $php = utf8_encode($php); 
     } 

     $new_ser = serialize($php); 

     # For checking that conversion happened correctly (compare the two files): 
     #file_put_contents('c:/dump0.txt', $getvalues['thevalue'] ."\r\n", FILE_APPEND); 
     #file_put_contents('c:/dump1.txt', $new_ser ."\r\n", FILE_APPEND); 

     $sql = "UPDATE ". $database .".". $table ." SET ". $tablecol ." = '". sql_esc($new_ser) ."' WHERE ". $primarykey ." = ". $getvalues['primkey']; 

     //TODO: insert code here for executing $sql against your database 

    } 
} 
echo '<div>Done with '. $tablecol .'</div>'; 
関連する問題