È la funzione serialize PHP compatibile UTF-8?
-
23-09-2019 - |
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
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).