سؤال

لدي موقع أريد الهجرة من 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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top