Из-за чего такое может быть с unserialize?18.03.2021 От: faq Из: Веб-строительство lutskboy 20 ноября 2020, 17:25 181ПриветствуюПереношу форум с одного сервера на другойтам в некоторых полях данные хранятся в serialize массивеи на новом сервере при unserialize получаю falseя смотрю на ету строку и там примерно такоеa:9:{s:11:"description";s:10:"Обсуждение";s:15:"additional_data";s:0:"";s:16:"informationTitle";s:0:"";s:15:"informationText";s:0:"";s:9:"rulesText";s:0:"";s:8:"newTopic";b:0;s:9:"readTopic";b:0;s:11:"replicTopic";b:0;s:8:"viewTree";a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}}если присмотреться то видим s:10:»Обсуждение»;но слово «Обсуждение» тут должно содержать точно не s:10. s:20 для русских символовкак из етого массива сделать нормальный?и почему там s:10?или ошибка не в етом? totamon 20 ноября 2020, 18:34 возможно разная кодировка бд, таблиц или текстового поля? timo-71 20 ноября 2020, 19:28 lutskboy :если присмотреться то видим s:10:»Обсуждение»;Норм, для cp1251.5 минут:<?php$o = 'a:9:{s:11:"description";s:10:"Обсуждение";s:15:"additional_data";s:0:"";s:16:"informationTitle";s:0:"";s:15:"informationText";s:0:"";s:9:"rulesText";s:0:"";s:8:"newTopic";b:0;s:9:"readTopic";b:0;s:11:"replicTopic";b:0;s:8:"viewTree";a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}}';header('Content-Type:text/plain');function _f(&$a){ foreach($a as $k=>$v) { if(is_array($v)){ $a[$k] = _f($v); } else { $a[$k] = is_string($v) ? $o = iconv ( 'cp1251' , 'utf-8' , $v ) : $v; } }}try { $o = iconv ( 'utf-8' , 'cp1251' , $o ); $o = unserialize($o); print_r($o); _f($o); print_r($o);} catch (Exception $e) { echo $e->getMessage(), "n";}exit();Результат:Array( [description] => ���������� [additional_data] => [informationTitle] => [informationText] => [rulesText] => [newTopic] => [readTopic] => [replicTopic] => [viewTree] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ))Array( [description] => Обсуждение [additional_data] => [informationTitle] => [informationText] => [rulesText] => [newTopic] => [readTopic] => [replicTopic] => [viewTree] => )Но, надо заранее знать, что «серили» (а как еще это назвать, когда json) в цп1251🤣 HelgaBorjoni 21 ноября 2020, 13:10https://gist.github.com/blessdyb/2b2f31a24e34f2c8da3733d49863c750Эта функция подойдет. PHP unserialize utf8 fixgist.github.com PHP unserialize utf8 fix. GitHub Gist: instantly share code, notes, and snippets. lutskboy 21 ноября 2020, 13:25 всем спасибо. буду разбираться timo-71 21 ноября 2020, 18:41 HelgaBorjoni #:Эта функция подойдет.function mb_unserialize($string) { $string = preg_replace('!s:(d+):"(.*?)";!se', "'s:'.strlen('$2').':"$2";'", $string); return unserialize($string);}С доработками для php 7+ в виде preg_replace_callback(). jkm 22 ноября 2020, 00:58!s:(d+):"(.*?)";!sЭта регулярка просто ищёт ближайшую кавычку за которой следует точка с запятой. Всё сломается если в самом тексте встретится эта последовательность.$str="какой-то "текст"; ещё текст";$str = serialize($str);echo $str, "n";preg_match('!s:(d+):"(.*?)";!s', $str, $match);echo $match[0], "n";Результат:s:47:"какой-то "текст"; ещё текст";s:47:"какой-то "текст"; Похожие записи:C99 JSON парсер / писатель Незавершенная ролевая игра Разделите строку и запишите i-й элемент в буфер с помощью C Класс, показывающий формат, аналогичный var_dump v1.0.5 Удобство разработки
lutskboy
Приветствую
Переношу форум с одного сервера на другой
там в некоторых полях данные хранятся в serialize массиве
и на новом сервере при unserialize получаю false
я смотрю на ету строку и там примерно такое
если присмотреться то видим s:10:»Обсуждение»;
но слово «Обсуждение» тут должно содержать точно не s:10.
s:20 для русских символов
как из етого массива сделать нормальный?
и почему там s:10?
или ошибка не в етом?
totamon
timo-71
если присмотреться то видим s:10:»Обсуждение»;
Норм, для cp1251.
5 минут:
Результат:
Но, надо заранее знать, что «серили» (а как еще это назвать, когда json) в цп1251🤣
HelgaBorjoni
https://gist.github.com/blessdyb/2b2f31a24e34f2c8da3733d49863c750
Эта функция подойдет.
lutskboy
timo-71
Эта функция подойдет.
С доработками для php 7+ в виде preg_replace_callback().
jkm
Эта регулярка просто ищёт ближайшую кавычку за которой следует точка с запятой. Всё сломается если в самом тексте встретится эта последовательность.
Результат: