Frage

Heute lief ich in ein Problem mit der strpos() PHP-Funktion, weil es FALSE zurückgegeben, selbst wenn das richtige Ergebnis war offensichtlich 0. Das war, weil ein Parameter in UTF-8 codiert wurde, aber der andere (Ursprung ist ein HTTP-GET-Parameter) offensichtlich nicht.

Nun habe ich festgestellt, dass mit der mb_strpos Funktion meines Problem gelöst.

Meine Frage ist nun: Ist es klug, die PHP Multibyte-String-Funktionen zu verwenden in der Regel Thesen Probleme in Zukunft zu vermeiden? Sollte ich vermeiden, dass die traditionellen strpos, strlen, ereg, etc., etc. Funktionen überhaupt?

Hinweis: Ich will nicht mbstring.func_overload global in php.ini setzen, weil dies zu anderen Problemen führt, wenn die PEAR-Bibliothek. Ich bin mit PHP4.

War es hilfreich?

Lösung

Es hängt von der Zeichenkodierung Sie verwenden. Im Single-Byte-Zeichenkodierungen oder UTF-8, dann solange die Zeichenfolge, die Sie suchen in und die Zeichenfolge, die Sie suchen verwenden (wo ein einzelnes Byte innerhalb eines Zeichens kann nie für einen anderen Charakter verwechselt werden) sind in der gleichen Codierung, dann können Sie auch weiterhin die regulären String-Suchfunktionen nutzen.

Wenn Sie mit einer Multi-Byte-Codierung andere als UTF-8 sind, die nicht einzelne Bytes innerhalb eines Zeichens nicht verhindern, wie andere Zeichen erscheinen, dann ist es niemals sicher eine String-Suche mit den normal String-Suchfunktionen zu tun. Sie können Fehlalarme finden. Dies liegt daran, dass die PHP-String-Vergleich in Funktionen wie strpos pro-Byte ist, und mit Ausnahme von UTF-8, die speziell dieses Problem zu vermeiden konzipiert ist, leiden Multi-Byte-Codierungen das Problem, dass jede nachfolgende Byte in einem Zeichen besteht aus mehr als ein Byte kann Teil eines anderen Charakters entspricht.

Wenn die Zeichenfolge Sie suchen in und die Zeichenfolge, die Sie für aus unterschiedlichen Zeichencodierungen suchen, dann Konvertierung immer notwendig sein. Ansonsten werden Sie feststellen, dass für jede Zeichenfolge, die unterschiedlich in der anderen Codierung dargestellt werden würden, wird es immer false zurück. Sie sollten eine solche Umwandlung bei der Eingabe tun: entscheiden, auf ein Zeichen Ihrer App codiert, verwenden, und innerhalb der Anwendung konsistent sein. Jedes Mal, wenn Sie Eingabe in einer anderen Kodierung empfangen, wandelt auf dem Weg in.

Andere Tipps

Es gibt einige Probleme mit den mb_ * Funktionen in PHP-Versionen vor 5.2. Also, wenn Ihr Code auf mehreren Plattformen mit unterschiedlichen Versionen von PHP gehen kann seltsames Verhalten auftreten. Das Weiteren die mb_ strpos Funktion eher langsam ist, hat sie die Anzahl der Zeichen durch die Offset-Parameter angegeben überspringen, um die reale Byte-Position intern verwendet zu erhalten. In Schlaufen auf der strpos / mb_strpos je nach Funktionalität kann dies ein großer Engpass werden.

Wenn Sie die gleiche Codierung überall verwenden es ist in der Regel kein Problem. Ich benutze UTF-8 für alle meine Seiten, und haben nie wirklich auf dieses Problem gestoßen. Am Ende kommt es wirklich auf die gleiche Codierung für die Seiten spezifizieren und die Datenbank.

Zum Beispiel:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

In den meisten Fällen bedeutet dies, dass alle Datenquellen für die Anwendung Daten in der gleichen Codierung liefern, und somit werden Sie diese Art von Problemen zu vermeiden.

Das wird alles viel besser mit dem Aufkommen PHP 6, btw, da es volle Unicode-Unterstützung enthalten wird.

Sie müssen nicht unbedingt mb_strpos verwenden, aber Sie müssen sicherstellen, dass alle Daten in Ihrer Anwendung ist das gleiche: entweder eine mb_string oder eine einfache Zeichenfolge in einer bestimmten Codierung. (In der Regel UTF-8.)

Wenn Sie sicherstellen, dass Ihre Seiten sind UTF-8, und Ihre Formularübermittlungen werden als UTF-8 interpretiert, und Ihre Datenbank speichert UTF-8, Sie werden in der Regel in Ordnung sein. Indizierte String-Operationen (insbesondere Verkürzungen) können eine UTF-8-Sequenz brechen, was ärgerlich ist, aber im Allgemeinen nicht katastrophal. Wenn Sie das Niveau der Unterstützung benötigen, mb_strings Ihre einzige Option ist (aber natürlich müssen Sie sicherstellen, dass alle Teile Ihrer App und Bibliotheken und PHP-Version mit ihnen umgehen können richtig).

Websites entwickeln, die Unicode korrekt in PHP verarbeiten ist nicht zu viel Spaß jetzt: seine Unicode-Unterstützung ist sehr schlecht im Vergleich zu Sprachen wie Python und .NET. Es ist zu hoffen PHP6 Angelegenheiten verbessern.

Ich würde empfehlen, die folgenden PHP UTF-8-Bibliothek:

http://sourceforge.net/projects/phputf8

Die Bündelung es mit Ihrer Anwendung lockert Anforderungen Ihrer Anwendung durch die mbstring Erweiterung nicht erforderlich ist, aber immer noch UTF-8-String-Funktionen erhalten.

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