A função PHP serializa o UTF-8 compatível com o UTF-8?
-
23-09-2019 - |
Pergunta
Eu tenho um site que quero migrar ISO para UTF-8.
Eu tenho um registro no banco de dados indexado pela seguinte chave primária:
s:22:"Informations générales";
O problema é que agora (com UTF-8), quando eu serializo a string, recebo:
s:24:"Informations générales";
(Observe que o tamanho da string agora é o número de bytes, não o comprimento da string)
Portanto, isso não é compatível com registros anteriores não UTF8!
Fiz algo de errado ? Como eu poderia consertar isso?
Obrigado
Solução
O comportamento está completamente correto. Duas cordas com codificações diferentes gerarão diferentes fluxos de bytes, portanto, diferentes cadeias de serialização.
Outras dicas
Despeje o banco de dados em latim1.
Na linha de comando:
sed -e 's/latin1/utf8/g' -i ./DBNAME.sql
Importar o arquivo convertido para um novo banco de dados no UTF-8.
Use um script PHP para atualizar cada campo. Faça uma consulta, passe por cada campo e atualize a string serializada usando esta:
$str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str);
Depois disso, pude usar o Unserialize () e tudo o que trabalha com o UTF-8.
Php 4 e 5 não possuem suporte de unicode embutido; Acredito que o PHP 6 está começando a adicionar mais suporte do Unicode, embora não tenha certeza de quão completo isso é.
Para não reiniciar uma matriz serializada codificada 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
}
Tinha a ver com a configuração "trimduplicates" no WebPart dos resultados da pesquisa.Para mais informações ...