Unserialize с перекодировкой символов UTF-8 на Php

Unserialize с перекодировкой символов UTF-8 на Php

04.03.2023
254
Unserialize - это процесс восстановления ранее сериализованных данных. В PHP для этой операции используется функция unserialize(). Однако, если в сериализованных данных содержатся символы utf-8, то при десериализации они могут быть некорректно преобразованы. В этом случае нужно выполнить дополнительные шаги.

Unserialize

это процесс восстановления ранее сериализованных данных. В PHP для этой операции используется функция unserialize(). Однако, если в сериализованных данных содержатся символы utf8, то при десериализации они могут быть некорректно преобразованы. В этом случае нужно выполнить дополнительные шаги.

Для корректной десериализации данных с символами utf8 необходимо выполнить следующие шаги:

  1. Преобразовать сериализованные данные в строку в кодировке base64 с помощью функции base64_encode(). Это делается для того, чтобы символы utf8 в сериализованных данных не были изменены при передаче через сеть или сохранении в файле. В результате получим строку в кодировке ASCII, которую можно передавать или сохранять без потери данных.
  2. Преобразовать строку из кодировки utf8 в кодировку ISO-8859-1 с помощью функции utf8_decode(). Это необходимо для того, чтобы символы utf8 были представлены в виде байтовой последовательности, которую можно корректно преобразовать в кодировку utf8. В результате получим строку в кодировке ISO-8859-1.
  3. Преобразовать строку из кодировки ISO-8859-1 в кодировку utf8 с помощью функции iconv() с параметрами 'ISO-8859-1' и 'UTF-8'. В результате получим строку в кодировке utf8, которую можно корректно десериализовать.
  4. Преобразовать строку из кодировки base64 в исходную сериализованную форму с помощью функции base64_decode(). В результате получим исходные сериализованные данные с символами utf8.
  5. Выполнить десериализацию преобразованной строки в массив или объект с помощью функции 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').