Frage

Ich habe eine Seite, die ich von migrierenden ISO UTF-8 .

Ich habe einen Datensatz in der Datenbank durch den folgenden Primärschlüssel indiziert:

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

Das Problem ist, jetzt (mit UTF-8), wenn ich die Zeichenfolge serialisiert, erhalte ich:

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

(man beachte die Größe der Saite ist jetzt auch die Anzahl von Bytes, nicht String-Länge)

Das ist also nicht kompatibel mit Nicht-UTF-8-Rekorden!

Habe ich etwas falsch gemacht? Wie könnte ich dieses Problem beheben?

Danke

War es hilfreich?

Lösung

Das Verhalten ist völlig korrekt. Zwei Strings mit unterschiedlichen Codierungen werden verschiedene Bytestreams erzeugen, damit unterschiedliche Serialisierung Strings.

Andere Tipps

Sichern Sie die Datenbank in latin1.

In der Befehlszeile:

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

Import konvertiert die Datei in eine neue Datenbank in UTF-8.

ein PHP-Skript Verwenden Sie jedes Feld zu aktualisieren. Erstellen Sie eine Abfrage, eine Schleife durch jedes Feld und aktualisieren Sie die serialisierte Zeichenfolge mit diesem:

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

Danach konnte ich unserialize () verwenden und alles mit UTF-8 zu arbeiten.

PHP 4 und 5 nicht haben eingebaute Unicode-Unterstützung; Ich glaube, PHP 6 beginnt mehr Unicode-Unterstützung hinzufügen, obwohl ich bin mir nicht sicher, wie vollständig das ist.

To deserialisieren eine UTF-8 codiert serialisiert Array:

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

Du hast nichts falsch. PHP vor v6 ist einfach nicht Unicode bewusst, und als solche nicht unterstützt wird, wenn Sie es nicht zu schlagen zu sein (das heißt, über die mbstring Erweiterung oder mit anderen Mitteln).

Wir schrieben hier unsere eigenen Wrapper um serialize() hier Abhilfe zu schaffen. Sie könnte auch zu anderen bewegen Serialisierungstechniken, wie JSON (mit json_encode() und json_decode() in PHP seit 5.2.0).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top