2009-02-17 7 views
3

En PHP, si je crée une chaîne comme ceci:PHP UTF-8 questions - Si je crée une chaîne en PHP ... est-ce en UTF-8?

 
$str = "bla bla here is my string"; 

Vais-je alors en mesure d'utiliser les fonctions mbstring pour fonctionner sur cette chaîne comme UTF8?

 
// Will this work? 
$str = mb_strlen($str); 

De plus, si je puis une autre chaîne que je sais est UTF-8 (dire que c'était une valeur sous forme d'affichage, ou une chaîne UTF-8 à partir d'une base de données), je peux concaténer alors ces deux et ne pas avoir de problèmes?

 
// What about this, will this work? 
$str = $str . $utf8_string_from_database; 

Répondre

10

Première question: cela dépend de ce qui se passe exactement dans la chaîne.

En PHP (jusqu'à PHP5, de toute façon), les chaînes ne sont que des séquences d'octets. Il n'y a aucun jeu de caractères implicite ou explicite associé à eux; c'est quelque chose que le programmeur doit suivre. Donc, si vous ne mettez UTF-8 octets valides entre les guillemets (assez facile si le fichier lui-même est codé en UTF-8), la chaîne sera UTF-8, et vous pouvez utiliser en toute sécurité mb_strlen() sur elle. En outre, si vous utilisez des fonctions mbstring, vous devez indiquer explicitement quel est le jeu de caractères de votre chaîne, soit avec mbstring.internal_encoding, soit comme dernier argument de toute fonction mbstring.

Deuxième question: oui, avec des mises en garde.

Deux chaînes qui sont toutes les deux indépendamment UTF-8 peuvent être concaténées en toute sécurité (comme avec l'opérateur . de PHP) et être toujours valide UTF-8. Cependant, vous ne pouvez jamais être sûr, sans faire un peu de travail vous-même, qu'une chaîne POSTed est valide UTF-8. Les chaînes de base de données sont un peu plus faciles, si vous définissez soigneusement le jeu de caractères de connexion, car la plupart des SGBD effectuent toute conversion pour vous.

2

Assurez-vous que votre directive default_charset est définie sur UTF-8 avant tout de cette exécution se produit.

soit modifier le php.ini directement ou le faire lors de l'exécution avec

<?php 

ini_set('default_charset', 'UTF-8'); 
+1

Tout cela ne fait contrôler les en-têtes envoyés au client. Cela n'affecte en fait rien sur la façon dont PHP gère les chaînes. – chazomaticus

+0

Il fait plus que cela. Essayez d'exécuter urldecode ('% C3% A9') avec un jeu de caractères par défaut de ISO-8859-1, puis de nouveau avec un jeu de caractères par défaut de UTF-8. Mais vous avez raison, cela n'a aucune incidence sur la façon dont PHP traite les chaînes au niveau des bits. –

+0

La seule raison pour laquelle vous obtiendriez des résultats différents est que votre navigateur interprète différemment ces octets. Comme je l'ai dit, cela n'affecte RIEN sur la façon dont PHP gère réellement les chaînes, WHATSOEVER. – chazomaticus

3

Si votre code source est en UTF-8, la chaîne est en UTF-8, sinon - ce n'est pas. Comme votre chaîne d'exemple est en anglais seulement, elle est valide en UTF-8.

PHP ne se connaît sur les jeux de caractères. Si vous transmettez des éléments à la fonction mb *, ils les traitent comme une chaîne UTF-8.

Enchaînement doit bien fonctionner, peu importe ce que, si je comprends UTF-8 droite :-) Assurez-vous les deux chaînes sont UTF-8, sinon vous obtiendrez étrange chaîne en conséquence.