هل وظيفة PHP Serialize متوافقة مع UTF-8؟
-
23-09-2019 - |
سؤال
لدي موقع أريد الهجرة من ISO ل UTF-8.
لدي سجل في قاعدة البيانات المفهرسة بواسطة المفتاح الأساسي التالي:
s:22:"Informations générales";
المشكلة هي الآن (مع UTF-8) ، عندما أقوم بتسلسل السلسلة ، أحصل على:
s:24:"Informations générales";
(لاحظ أن حجم السلسلة هو الآن عدد البايتات ، وليس طول السلسلة)
لذلك هذا غير متوافق مع السجلات السابقة غير UTF8!
هل فعلت شيئا خطأ ؟ كيف يمكنني إصلاح هذا؟
شكرًا
المحلول
السلوك صحيح تماما. ستقوم سلسلتان مع ترميزات مختلفة بتوليد تدفقات بايت مختلفة ، وبالتالي سلاسل التسلسل المختلفة.
نصائح أخرى
تفريغ قاعدة البيانات في 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
}
لم تفعل شيئًا خاطئًا. PHP قبل V6 فقط لا يدرك Unicode ، وعلى هذا النحو لا يدعمه ، إذا لم تكن تغلب عليها (أي ، عبر mbstring
تمديد أو وسائل أخرى).
لقد كتبنا هنا غلافنا الخاص serialize()
لعلاج هذا. يمكنك أيضًا الانتقال إلى تقنيات التسلسل الأخرى ، مثل JSON (مع json_encode()
و json_decode()
في PHP منذ 5.2.0).