Je voudrais assurez-vous que tout ce que je sais à propos de l'UTF-8 est correct. J'ai essayé d'utiliser UTF-8 pour un certain temps maintenant, mais je continue de tomber sur plus et plus de bugs et d'autres choses étranges qui font qu'il semble presque impossible d'avoir un 100% UTF-8 site. Il y a toujours un piège quelque part que j'ai l'impression de passer à côté. Peut-être que quelqu'un ici peut corriger ma liste ou sur OK afin de ne pas manquer quelque chose d'important.
Base de données
Chaque site dispose d'y stocker des données quelque part. Quel que soit votre configuration PHP vous devez également configurer la DB. Si vous ne pouvez pas accéder aux fichiers de configuration puis assurez-vous de "SET NAMES 'utf8'" dès que vous vous connectez. Aussi, assurez-vous d'utiliser utf8_ unicode_ ci sur l'ensemble de vos tables. Cela suppose de MySQL pour la base de données, vous aurez à changer pour les autres.
Regex
Je fais BEAUCOUP de regex qui est plus complexe que la moyenne rechercher-remplacer. J'ai pas oublier d'utiliser le "/u" modificateur de sorte que PCRE ne pas endommager mes cordes. Pourtant, même alors, il y a encore des problèmes apparemment.
Les Fonctions De Chaîne
L'ensemble de la chaîne par défaut des fonctions (strlen(), strpos(), etc.) doit être remplacé par Chaîne multi-octets Fonctions que regarde le personnage au lieu de l'octet.
Les en-têtes Vous devriez assurez-vous que votre serveur est de retour le bon en-tête du navigateur pour savoir quel jeu de caractères que vous souhaitez utiliser (tout comme vous devez l'indiquer à MySQL).
header('Content-Type: text/html; charset=utf-8');
Il est également une bonne idée de mettre la bonne balise < meta > dans la page de la tête. Si l'en-tête de remplacer ce devrait ils diffèrent.
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Questions
Ai-je besoin pour convertir tout ce que je reçois de l'agent utilisateur (au format HTML et URI) de l'UTF-8 lorsque le chargement de la page, ou si je peux laisser juste les cordes/valeurs telles qu'elles sont et encore exécuter par le biais de ces fonctions sans problème?
Si j'ai besoin de tout convertir en UTF-8 alors quelles mesures dois-je prendre? mb_detect_encoding semble être construit pour cela, mais je continue à voir des gens se plaignent que ça ne fonctionne pas toujours. mb_check_encoding semble aussi avoir un problème de raconter une chaîne UTF-8 à partir d'un mal formé un.
N'PHP stocker des chaînes dans la mémoire différemment selon ce que le codage qu'il utilise (comme les types de fichiers) ou est-il encore dans la mémoire comme un aiguillon avec quelques-uns des caractères interprétés différemment (comme & amp; vs & en HTML). chazomaticus répond à cette question:
En PHP (jusqu'à PHP5, de toute façon), cordes sont juste des séquences d'octets. Il est aucune implicite ou explicite d'un jeu de caractères associé avec eux; c'est quelque chose le programmeur doit garder la trace de.
Si l'un donne une non-chaîne UTF-8 pour une mb_* fonction il toujours causer un problème?
Si une chaîne UTF est mal codés sera quelque chose de mal se passer (comme une erreur d'analyse dans les regex?) ou est-ce juste l'occasion d'une entité comme mauvais (html)? Est-il jamais une chance que mal codés chaînes de résultats en fonction renvoyant FALSE car la chaîne est mauvais?
J'ai entendu dire que vous devez vous marque les formes en UTF-8 aussi (accept-charset="UTF-8"), mais je ne suis pas sûr de ce que la prestation est..?
A l'UTF-16 écrite à l'adresse d'une limite en UTF-8? Comme n'UTF-8 a plus de place pour les personnages? (Y2(UTF)k?)
Fonctions
Ici sont un couple de la coutume des fonctions PHP que j'ai trouvé mais je n'ai pas moyen de vérifier qu'ils fonctionnent réellement. Peut-être quelqu'un a un exemple que je peux utiliser. La première est convertToUTF8() et puis seems_utf8 à partir de wordpress.
function seems_utf8($str) {
$length = strlen($str);
for ($i=0; $i < $length; $i++) {
$c = ord($str[$i]);
if ($c < 0x80) $n = 0; # 0bbbbbbb
elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb
elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb
elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb
elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb
elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b
else return false; # Does not match any model
for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
return false;
}
}
return true;
}
function is_utf8($str) {
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}
Si quelqu'un est intéressé, j'ai trouvé un excellent exemple de la page à utiliser lors de l'essai de l'UTf-8.