2008-10-21 3 views
5

Ich bin dabei, meine PHP-Site Unicode-fähig zu machen. Ich frage mich, ob jemand Erfahrung mit der mbstring.func_overload Einstellung hat, die die normalen String-Funktionen (z. B. strlen) mit ihren Multi-Byte-Äquivalenten (mb_strlen) ersetzt. Es gibt keine Kommentare auf der PHP-Handbuchseite.Sollte ich Multi-Byte-Überladung verwenden (mbstring.func_overload)?

Gibt es mögliche Probleme, die ich beachten sollte? Fälle, in denen das Aufrufen der Multi-Byte-Version eine schlechte Idee ist?

Ich nehme an, ein Beispiel wären Funktionen, die sich mit der Verschlüsselung beschäftigen, da sie mit Zeichenfolgen und nicht mit Zeichenketten rechnen können.

Außerdem enthält die Handbuchseite einen Hinweis: "Es wird nicht empfohlen, die Funktionsüberladungsoption im Kontext pro Verzeichnis zu verwenden, da es in einer Produktionsumgebung noch nicht stabil genug ist und zu undefiniertem Verhalten führen kann . "

Bedeutet dies, dass es in einem Kontext pro Verzeichnis nicht stabil ist oder es im Allgemeinen nicht stabil ist? Die Formulierung ist unklar.

Antwort

4

ein Problem, das Sie unbedingt beachten sollten, ist 3rd Party Skripte (vielleicht eine Bibliothek oder Birne Erweiterung), die nicht mb-bewusste Versionen von Funktionen verwendet. Beispielsweise können Bibliotheken, die strlen() verwenden, Probleme verursachen, wenn Sie sie überlasten.

auch diese bug report zeigt, dass das virtuelle Host-Bluten von mb_overloaded Funktionen in 5.2/5.3 CVS-Versionen korrigiert wurden. Der Fehler ist spezifisch für Konfigurationen pro Verzeichnis.

5

Meine Antwort ist: definitiv nicht!

Das Problem ist, dass es keine einfache Möglichkeit gibt, die str * -Funktionen zu "zurücksetzen", sobald sie überlastet sind.

Für einige Zeit kann dies gut mit Ihrem Projekt arbeiten, aber fast sicher werden Sie in eine externe Bibliothek laufen, die String-Funktionen verwendet, um zum Beispiel ein binäres Protokoll zu implementieren, und sie werden fehlschlagen. Sie werden versagen und Sie werden Stunden damit verbringen, herauszufinden, warum sie versagen.

Nachdem Sie festgestellt haben, dass es mbstring.func_overload ist, haben Sie nicht zu viel Option. Sie können die mbstring.internal_encoding Codierung auf ein Byte pro Char codieren, wenn Sie die externe Bibliothek aufrufen und gleich danach zurückstellen, aber wenn Ihre Bibliothek Rückrufe zu Ihrer Anwendung macht, wird das nur Probleme verursachen.

Eine andere Möglichkeit besteht darin, die Bibliothek manuell zu optimieren, indem alle str * -Funktionen in ihr mb_string-Gegenstück geändert werden und ein Ein-Byte-pro-Zeichen als Codierungsparameter übergeben wird. Dies ist jedoch auch keine gute Idee, da Sie die Möglichkeit verlieren, Ihre externen Geräte einfach zu aktualisieren, und Sie könnten auch einige Leistungsprobleme verursachen.

Also, wieder nicht func_overload verwenden. Wenn Sie mit Multi-Byte-Strings arbeiten, verwenden Sie die entsprechenden mb_-Funktionen.

+0

mbstring.func_overload hat mich nur schlecht durchgebissen, und ich muss mich wundern, wie viele der derzeit ungelösten Probleme, die ich erhalten habe, darauf zurückzuführen sind. Ich schrieb eine Klasse, um ePub-Dateien zu generieren, und eine Companion-Klasse, um Zip-Dateien zu bearbeiten. Es gab einige Gründe, warum die in Zip eingebauten Funktionen nicht nützlich waren. Ich habe das ganze Wochenende gebraucht, bis der, der den Fehler gemeldet hat, ihren Server für utf-8 eingerichtet hat. Ich wusste nicht einmal, dass mbstring.func_overload existiert, und jetzt stehe ich in Schwierigkeiten, weil das Setzen von mbstring auf ascii auch nicht möglich ist, da ich * auch * UTF-8 mit mb_-Funktionen verwende. –

Verwandte Themen