Unserialize
это процесс восстановления ранее сериализованных данных. В PHP для этой операции используется функция unserialize()
. Однако, если в сериализованных данных содержатся символы utf8, то при десериализации они могут быть некорректно преобразованы. В этом случае нужно выполнить дополнительные шаги.
Для корректной десериализации данных с символами utf8 необходимо выполнить следующие шаги:
- Преобразовать сериализованные данные в строку в кодировке base64 с помощью функции
base64_encode()
. Это делается для того, чтобы символы utf8 в сериализованных данных не были изменены при передаче через сеть или сохранении в файле. В результате получим строку в кодировке ASCII, которую можно передавать или сохранять без потери данных. - Преобразовать строку из кодировки utf8 в кодировку ISO-8859-1 с помощью функции
utf8_decode()
. Это необходимо для того, чтобы символы utf8 были представлены в виде байтовой последовательности, которую можно корректно преобразовать в кодировку utf8. В результате получим строку в кодировке ISO-8859-1. - Преобразовать строку из кодировки ISO-8859-1 в кодировку utf8 с помощью функции
iconv()
с параметрами'ISO-8859-1'
и'UTF-8'
. В результате получим строку в кодировке utf8, которую можно корректно десериализовать. - Преобразовать строку из кодировки base64 в исходную сериализованную форму с помощью функции
base64_decode()
. В результате получим исходные сериализованные данные с символами utf8. - Выполнить десериализацию преобразованной строки в массив или объект с помощью функции
unserialize()
.
Пример:
$serialized_data = '...'; // сериализованные данные с символами в кодировке utf-8
// Преобразование сериализованных данных в строку в кодировке base64 для сохранения символов utf8
$base64_data = base64_encode($serialized_data);
// Преобразование строки из кодировки utf8 в кодировку ISO-8859-1
// для того, чтобы символы utf8 были представлены в виде байтовой последовательности,
// которую можно корректно преобразовать в кодировку utf8
$iso_data = utf8_decode($base64_data);
// Преобразование строки из кодировки ISO-8859-1 в кодировку utf8 с помощью функции iconv()
$utf8_data = iconv('ISO-8859-1', 'UTF-8', $iso_data);
// Преобразование строки из кодировки base64 в исходную сериализованную форму
$unserialized_data = unserialize(base64_decode($utf8_data));
Переменная $serialized_data
содержит сериализованные данные с символами в кодировке utf-8.
Также стоит отметить, что для корректной работы функций utf8_decode()
и iconv()
необходимо, чтобы на сервере была установлена необходимая локаль. Для установки локали можно воспользоваться функцией setlocale()
, например: setlocale(LC_ALL, 'ru_RU.UTF-8')
.