Строки, создаваемые serialize
, являются двоичными строками, они не имеют определенной кодировки кодировки, а представляют собой просто «массив» байтов (где один байт равен 8 битам, октет).
Если вы сейчас возьмете такую строку и скажете своей базе данных, что она закодирована в LATIN-1, и ваша база данных сохранит ее в текстовое поле с кодировкой UTF-8, база данных будет прозрачно менять кодировку с LATIN-1 на UTF. -8. UTF-8 - это кодировка кодировки, которая использует более одного байта на символ для некоторых символов, например, тех, которые вы задаете в своем вопросе, например é
.
Символ é
затем сохраняется как é
внутри базы данных, которая является байтовой последовательностью UTF-8 для é
.
Если вы теперь извлекаете данные из базы данных, не указывая, в какой кодировке они вам нужны, база данных вернет их как UTF-8.
Теперь unserialize
имеет проблему, потому что двоичная строка была модифицирована таким образом, что делает ее недействительной.
Вместо этого вам нужно либо указать вашей базе данных, что она не должна изменять кодировку при хранении сериализованной строки, например, выбрав правильный тип столбца и кодировку (двоичное поле, BLOB - Большой двоичный объект & shy; Документы MySQL , см. также Двоичные типы & shy; Propel Docs ) или при извлечении данных из базы данных вы возвращаете кодировку кодировки обратно в исходный формат. Первый подход (двоичное поле) лучше, потому что это именно то, что вы ищете.
Для данных, которые уже были сохранены в базе данных в неправильном формате, вам необходимо исправить данные. Для этого сначала нужно выяснить, какое перекодирование было применено, например, из какой кодировки в какую кодировку. Я предполагаю, что это LATIN-1, но нет никакой гарантии. Вам необходимо проверить кодировку данных вашего текущего приложения и процессов, чтобы выяснить это.
После того, как вы узнали, закодируйте значения обратно из UTF-8 в исходную кодировку.