Pregunta

Tengo un sitio Quiero migrar de ISO a UTF-8 .

Tengo un registro en la base de datos indexada por la clave principal siguiente:

s:22:"Informations générales";

El problema es que ahora (con UTF-8), cuando serializar la cadena, me sale:

s:24:"Informations générales";

(nótese el tamaño de la cadena es ahora el número de bytes, no longitud de la cadena)

Así que esto no es compatible con la no-UTF8 registros anteriores!

¿He hecho algo mal? ¿Cómo podría solucionar este problema?

Gracias

¿Fue útil?

Solución

El comportamiento es completamente correcto. Dos cadenas con diferentes codificaciones generarán diferentes flujos de bytes, por lo tanto diferentes cadenas de serialización.

Otros consejos

volcar la base de datos en latin1.

En la línea de comandos:

sed  -e 's/latin1/utf8/g' -i ./DBNAME.sql

Importar el archivo convertido a una nueva base de datos en UTF-8.

Utilice un script php para actualizar cada campo. Hacer una consulta, bucle a través de cada campo y actualizar la cadena serializada utilizando la siguiente:

$str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str);

Después de eso, fue capaz de utilizar unserialize () y todo el trabajo con UTF-8.

PHP 4 y 5 no se han incorporado en el soporte Unicode; Creo PHP 6 está empezando a añadir más soporte Unicode aunque no estoy seguro de cómo completo que es.

Para unserialize una matriz serializado codificación 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
}

Usted no hizo nada mal. PHP antes de la v6 no es consciente de Unicode, y como tal no lo soporta, si no lo bate a ser (es decir, a través de la extensión mbstring u otros medios).

aquí escribimos nuestra propia envoltura alrededor serialize() para remediar esto. Podría, también, traslado a otras técnicas de serialización, como JSON (con json_encode() y json_decode() en PHP desde 5.2.0).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top