Domanda

Ho un sito che voglio migrare da ISO a UTF-8 .

Ho un record nel database indicizzato dal seguente chiave primaria:

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

Il problema è che ora (con UTF-8), quando ho serializzare la stringa, ottengo:

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

(si noti la dimensione della stringa è ora il numero di byte, non lunghezza della stringa)

Quindi questo non è compatibile con i record precedenti non UTF8!

Ho fatto qualcosa di sbagliato? Come potrei risolvere questo problema?

Grazie

È stato utile?

Soluzione

Il comportamento è del tutto corretta. Due stringhe con differenti codifiche genereranno diversi flussi di byte, così diverse stringhe di serializzazione.

Altri suggerimenti

il dump del database in latin1.

Nella riga di comando:

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

Importare il file convertito in un nuovo database in UTF-8.

Utilizzare uno script php per aggiornare ogni campo. Fare una query, ciclo attraverso ogni campo e aggiornare la stringa serializzata utilizza questo:

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

Dopo di che, sono stato in grado di utilizzare unserialize () e tutto lavorare con UTF-8.

PHP 4 e 5 non sono dotati di supporto Unicode; Credo PHP 6 sta iniziando a aggiungere più supporto Unicode anche se non sono sicuro di come completo che è.

Per deserializzare un array serializzato utf-8 codificati:

$array = @unserialize($arrayFromDatabase);
if ($array === false) {
  $array =  @unserialize(utf8_decode($arrayFromDatabase)); //decode first
  $array = array_map('utf8_encode', $array ); // encode the array again
}

Non hai fatto niente di sbagliato. PHP prima v6 solo non è Unicode conoscenza, e come tale non lo supporta, se non Battere per essere (cioè, tramite l'estensione mbstring o altri mezzi).

qui scritto il nostro wrapper serialize() per rimediare a questo. Si potrebbe anche passare ad altre tecniche di serializzazione, come JSON (con json_encode() e json_decode() in PHP dal 5.2.0).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top