Scheiß Encoding

Nachdem ich heute wiedereinmal fluchend vor serialisierten UTF-8 werten saß, hier mal meine Heutigen Erkenntnisse zum Thema.

UTF-8 sollte einfach immer und überall im Web Standard sein und wer heutzutage noch irgendwas dagegen hat soll mir einen vernünftigen Grund liefern.

Drupal speichert Daten gerne Serialisiert. Also lese ich diese aus und lasse die PHP Funktion unserialize darüber laufen. Problem sobald [ßöäü] drin ist klappte es nicht mehr.

Okay also ein Encoding-Problem. Google hilft nicht wirklich weiter. Empfehlungen welche ich gefunden habe waren folgende.

  • base_64_encode – bevor man in die DB schreibt. [1]
    • klappt nicht, da ich in die Drupal Save nicht eingreifen möchte.
  • irgendwelche magischen preg_replace zum nachzählen der Serialisierten Strings [2]
    • Will ich auch nicht machen, nicht mehr wartbar und außerdem kann ich dann nie sicher sein das die Daten in der Datenbank korrekt sind.

Ergebnis war das ich analysiert habe wie (also mit welchem Encoding) Drupal auf die Datenbank zugreift. Ergebnis hier war „natürlich“ UTF-8.

Nun mein Datenlese-Tool greift per mysqli ohne genau definiertes Encoding darauf zu. Somit holt sich mein Tool die Daten in ISO-irgendwas.

Damit hat mein eingelesener Beispiel String: „Scheiß Encoding“ eine länge von 15. Nun steht aber in der Datenbank der Serialisierte Wert: s:16:"Scheiß Encoding"; dieser Umstand bringt unserialize dazu mit E_NOTICE abzustürzen und einfach nur FALSE zu liefern.

Datenbankverbindung via mysqli::set_charset('utf8') auf UTF-8 gestellt und magic, schon funktioniert alles wunderbar.

[1] http://blog.emeidi.com/2012/07/16/phps-serialize-und-unserialize-funktion-mit-unicode-problemen
[2] http://www.php.net/manual/en/function.unserialize.php#107886

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.