Question

Aujourd'hui, j'ai rencontré un problème avec la fonction php strpos() car elle renvoyait FALSE même si le résultat correct était évidemment 0. Cela était dû au fait qu'un paramètre était codé en UTF-8, mais que l'autre (origine était un HTTP GET paramètre) évidemment pas.

Maintenant, j'ai remarqué que l'utilisation de la mb_strpos fonction résolvait mon problème.

Ma question est la suivante: est-il judicieux d'utiliser les fonctions de chaîne de caractères multi-octets PHP en général pour éviter ces problèmes à l'avenir? Devrais-je éviter les fonctions traditionnelles strpos, strlen, ereg, etc., etc.?

Remarque: je ne souhaite pas définir mbstring.func_overload global dans php.ini, car cela pose d'autres problèmes lors de l'utilisation de la bibliothèque PEAR. J'utilise PHP4.

Était-ce utile?

La solution

Cela dépend du codage de caractères que vous utilisez. Dans les codages de caractères à un octet, ou UTF-8 (où un seul octet à l'intérieur d'un caractère ne peut jamais être confondu avec un autre caractère), tant que la chaîne que vous recherchez et la chaîne que vous utilisez pour la recherche sont identiques. alors vous pouvez continuer à utiliser les fonctions de recherche de chaînes habituelles.

Si vous utilisez un codage multi-octets autre que UTF-8, qui n'empêche pas l'affichage des octets uniques dans un caractère comme d'autres caractères, il n'est jamais prudent d'effectuer une recherche de chaîne à l'aide des fonctions de recherche de chaîne habituelles. Vous pouvez trouver des faux positifs. Ceci est dû au fait que la comparaison de chaînes de PHP dans des fonctions telles que strpos se fait octet par octet, et à l'exception de UTF-8 qui est spécialement conçu pour éviter ce problème, les codages sur plusieurs octets sont gênés par le fait que tout octet suivant dans un caractère composé de plusieurs octets peuvent correspondre à une partie d'un caractère différent.

Si la chaîne dans laquelle vous recherchez dans et que vous recherchez des codages de caractères différents, la conversion sera toujours nécessaire. Sinon, vous constaterez que pour toute chaîne qui serait représentée différemment dans l'autre codage, elle retournera toujours la valeur false. Vous devez effectuer cette conversion lors de la saisie: choisissez un codage de caractères que votre application utilisera et restez cohérent dans l'application. Chaque fois que vous recevez une entrée dans un codage différent, effectuez la conversion en entrant.

Autres conseils

Il y a eu quelques problèmes avec les fonctions mb_ * dans les versions de PHP antérieures à la 5.2. Donc, si votre code est utilisé sur plusieurs plates-formes avec différentes versions de PHP, un comportement étrange peut se produire. De plus, la fonction mb_ strpos est plutôt lente, elle doit ignorer le nombre de caractères spécifié par le paramètre offset pour obtenir la position d'octet réelle utilisée en interne. Dans les boucles dépendant de la fonctionnalité strpos / mb_strpos, cela peut devenir un goulot d'étranglement majeur.

Si vous utilisez le même encodage partout, ce n'est généralement pas un problème. J'utilise UTF-8 pour toutes mes pages et je n'ai jamais rencontré ce problème. Au final, il s’agit vraiment de spécifier le même encodage pour les pages et la base de données.

Par exemple:

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

Dans la plupart des cas, cela signifie que toutes les sources de données de l'application fourniront des données dans le même encodage, ce qui vous évitera ce genre de problèmes.

Tout cela sera bien mieux avec l'avènement de PHP 6, car il inclura un support complet de l'unicode.

Vous n'avez pas nécessairement besoin d'utiliser mb_strpos, mais vous devez vous assurer que toutes les données de votre application sont les mêmes: soit une chaîne mb_string, soit une chaîne simple dans un codage particulier. (Habituellement UTF-8.)

Si vous vous assurez que vos pages sont au format UTF-8 et que vos formulaires sont interprétés comme du format UTF-8, et que votre base de données stocke le format UTF-8, vous serez généralement OK. Les opérations sur les chaînes de caractères indexées (en particulier les troncatures) peuvent interrompre une séquence UTF-8, ce qui est gênant mais généralement pas désastreux. Si vous avez besoin de ce support, mb_strings est votre seule option (mais vous devez bien sûr vous assurer que toutes les parties de votre application, de vos bibliothèques et de la version PHP peuvent les gérer correctement).

Développer des sites qui gèrent correctement Unicode en PHP n’est pas très amusant à l’heure actuelle: son support Unicode est très médiocre comparé à des langages tels que Python et .NET. Espérons que PHP6 améliorera les choses.

Je recommanderais d'utiliser la bibliothèque PHP UTF-8 suivante:

http://sourceforge.net/projects/phputf8

Le regroupement avec votre application assouplit les exigences de votre application en ne nécessitant pas l'extension mbstring, mais vous obtenez tout de même des fonctions de chaîne UTF-8.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top