PHPのシリアル化機能は、互換性のUTF-8ですか?
-
23-09-2019 - |
質問
私はから移行したいサイトを持っているの 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のような他のシリアライズ技術への移行ます。