質問

私はから移行したいサイトを持っているの ISO のへの UTF-8 の。

私は、次の主キーでインデックス付けデータベースのレコードを持っています:

s:22:"Informations générales";

私は、文字列をシリアル化するときの問題は、(UTF-8で)今、ある、I GETます:

s:24:"Informations générales";

(通知文字列のサイズは、現在のバイト数ではなく、文字列の長さ)

これは非UTF8以前の記録との互換性がありませんので!

私は何かが間違っをしましたか?どのように私はこの問題を解決するだろうか?

おかげ

役に立ちましたか?

解決

は動作が完全に正しいです。異なるエンコーディングを持つ2つの文字列は、このように異なるシリアライズ文字列、異なるバイトストリームを生成します。

他のヒント

latin1のデータベースをダンプします。

コマンドラインでます:

sed  -e 's/latin1/utf8/g' -i ./DBNAME.sql

インポートファイルはUTF-8での新しいデータベースに変換します。

各フィールドを更新するためにPHPスクリプトを使用してください。 各フィールドを通じてクエリ、ループを作成し、これを使用してシリアル化された文字列を更新します:

$str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str);
その後、私はアンシリアライズ()とUTF-8での作業のすべてを使用することができました。

PHP 4と5は組み込まれていませんUnicodeサポート。私はPHP 6私は確信してどのように完了したことないんだが、より多くのUnicodeサポートを追加するために始めていると信じています。

UTF-8でエンコードされたシリアル化配列をアンシリアライズするには、次の

$array = @unserialize($arrayFromDatabase);
if ($array === false) {
  $array =  @unserialize(utf8_decode($arrayFromDatabase)); //decode first
  $array = array_map('utf8_encode', $array ); // encode the array again
}

あなたは間違って何もしませんでした。前V6へのPHPだけではUnicode認識していない、とあなたは(すなわち、mbstring拡張子または他の手段を介して)であること、それを破っていない場合など、それをサポートしていません。

ここではこの問題を解決するためにserialize()の周りに私たち自身のラッパーを書きました。あなた可能性も、(5.2.0以降のPHPでjson_encode()json_decode()付き)JSONのような他のシリアライズ技術への移行ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top