XOOPS Cubeで文字コードをEUC-JPからUTF-8へ変更したときに、DBにEUC-JPでseriarizeした値が保存されてて、それをUTF-8で取り出したいケースがあったんで、そのときにやった方法をメモっときます。
ちなみにXOOPS Cubeでこのケースにあたったのはwaffleモジュールです。
文字列をシリアライズするとその文字列のバイト数とその文字って組み合わせで表現したテキストに変換されるので、EUC-JPでシリアライズされたデータはEUC-JPでアンシリアライズしないと、バイト長変わってしまってアンシリアライズできないんですよね。
ってことで下記の様にしてアンシリアライズしました。
// 内部エンコーディングを EUC-JP にしとく
mb_internal_encoding('EUC-JP');
// DBからとってきた$data はUTF-8になってるのでEUC-JPに変換してからunserialize
$result = unserialize(mb_convert_encoding($data, 'EUC-JP', 'UTF-8'));
// unserializeされた値をUTF-8へ
// https://qiita.com/RyujiAMANO/items/3b7adb23408ad100375d に書いた関数使ってます。
$result = mb_convert_encoding_recursive($result, 'UTF-8', 'EUC-JP');
// 内部エンコーディングを元のUTF-8にもどす
mb_internal_encoding('UTF-8');