PHP serialize fonksiyonu uyumlu UTF-8 mi?

6 Cevap php

Ben UTF-8 için ISO göç etmek istediğiniz bir site var.

Ben aşağıdaki birincil anahtar dizini veritabanında bir kayıt var:

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

Sorun dize serialize, ben olsun, (UTF-8) şimdi,:

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

(String boyutu artık bayt sayısı değil, dize uzunluğu fark)

So this is not compatible with non-utf8 previous records !

Yanlış bir şey mi yaptım? Bunu nasıl düzeltebilirim ki?

Teşekkürler

6 Cevap

Davranış tamamen doğrudur. Farklı kodlamaları ile iki dizeleri, böylece farklı serileştirme dizeleri farklı bayt akışı üretmek olacaktır.

PHP 4 ve 5 yerleşik olmayan Unicode desteği; PHP 6 Bunun nasıl olduğunu tam emin değilim ancak daha fazla Unicode desteği eklemek başlıyor inanıyorum.

Latin1 veritabanını dökümü.

Komut satırında:

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

Dosya UTF-8 yeni bir veritabanına dönüştürülmüş ithalat.

Use a php script to update each field. Make a query, loop through each field and update the serialized string using this:

$str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str);

Bundan sonra, unserialize () ve UTF-8 ile çalışan her şeyi kullanmak mümkün oldu.

Sen yanlış bir şey yaptım. PHP önce sadece Unicode uyumlu V6, ve bunu olmak dövmek yoksa gibi (yani mbstring uzantısı veya diğer yollarla), bunu desteklemiyor.

Biz burada serialize() bu durumu düzeltmek için etrafında kendi sarıcı yazdı. Siz de, (5.2.0 'dan beri PHP json_encode() ve json_decode()) ile JSON gibi, diğer serileştirme teknikleri hareket olabilir.

Bir utf-8 kodlanmış tefrika dizi nesneleştirmek:

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

Bu çok eski bir soru, ama HTML sayfası UTF-8 charset'in var ve sonda sen tefrika dizi test etmek için bu kodu kullanabilirsiniz eğer PHP dosyası UTF8 kodlanmış olup olmadığını doğrulamak için emin olun:

echo "<pre>".utf8_decode(var_export(unserialize(utf8_encode($text)),true))."</pre>";

Eğer çalışırsa, sen var_export fonksiyonu olmadan dizi (geri yüklemek için kodu kullanabilirsiniz: utf8_decode(unserialize(utf8_encode($text))) )