Совместима ли функция сериализации PHP с UTF-8? - PullRequest
5 голосов
/ 30 марта 2010

У меня есть сайт, который я хочу перенести с ISO на UTF-8 .

У меня есть запись в базе данных, проиндексированная следующим первичным ключом:

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

Проблема в том, что теперь (с UTF-8), когда я сериализую строку, я получаю:

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

(обратите внимание, что размер строки теперь равен количеству байтов, а не длине строки)

Так что это не совместимо с предыдущими записями не-utf8!

Я сделал что-то не так? Как я мог это исправить?

Спасибо

Ответы [ 5 ]

4 голосов
/ 26 июня 2011

Дамп базы данных в латинице 1.

В командной строке:

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

Импорт файла, преобразованного в новую базу данных в UTF-8.

Используйте php-скрипт для обновления каждого поля. Сделайте запрос, пройдитесь по каждому полю и обновите сериализованную строку, используя это:

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

После этого я смог использовать unserialize () и все, что работает с UTF-8.

2 голосов
/ 30 марта 2010

Поведение совершенно правильно. Две строки с разными кодировками будут генерировать разные потоки байтов, поэтому разные строки сериализации.

1 голос
/ 29 октября 2013

Для десериализации сериализованного массива в кодировке 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
}
1 голос
/ 30 марта 2010

PHP 4 и 5 не имеют встроенной поддержки Unicode; Я считаю, что в PHP 6 начинает добавляться поддержка Unicode, хотя я не уверен, насколько это завершено.

0 голосов
/ 30 марта 2010

Вы не сделали ничего плохого. PHP до v6 просто не поддерживает Unicode и поэтому не поддерживает его, если вы не справитесь с этим (т.е. с помощью расширения mbstring или другими способами).

Мы здесь написали нашу собственную оболочку вокруг serialize(), чтобы исправить это. Вы также можете перейти к другим методам сериализации, таким как JSON (с json_encode() и json_decode() в PHP начиная с 5.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...