Vérifier si une chaîne est codé en UTF-8
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;
}
J'ai eu ce code de WordPress, je ne sais pas beaucoup sur ce sujet, mais je voudrais savoir ce qu'est exactement happing dans cette fonction.
Si quelqu'un sait s'il vous plaît m'aider?
J'ai besoin de l'idée claire sur le code ci-dessus. Si, ligne par ligne, l'explication sera plus utile.
OriginalL'auteur coderex | 2009-09-24
Vous devez vous connecter pour publier un commentaire.
J'utilise deux méthodes pour vérifier si la chaîne est en utf-8 (selon le cas):
-- OU --
Pour la mb_internal_encoding - en raison de certaines inconnu pour moi bug dans php (version 5.3- (ne l'ai pas testé sur 5.3)) en passant le codage en tant que paramètre à la mb_ ne fonctionne pas et le codage interne doit être défini avant toute utilisation de fonctions mb_.
mb_strlen ($string, 'UTF-8')
ensuite.OriginalL'auteur bisko
Cet algorithme est essentiellement de vérifier si la séquence d'octets est conforme au modèle que vous pouvez voir dans la Article de Wikipedia.
La
for
boucle est de passer par tous les octets dans$str
.ord
obtient le nombre décimal de l'actuelle de l'octet. Ce nombre est ensuite testé pour certaines propriétés.Si le nombre si moins de 128 (0x80), c'est un seul octet caractère. Si elle est égale ou supérieure à 128, la longueur des caractères multi-octets est cochée. Qui peut être fait avec le premier caractère d'un de caractères multi-octets de la séquence. Si le premier octet commence par
110xxxxx
, c'est un deux octets de caractères;1110xxxx
, c'est un de trois octets de caractères, etc.Je pense que le plus cryptical sont les parties les expressions comme
($c & 0xE0) == 0xC0
. C'est pour vérifier si le nombre en format binaire a certains modèle spécifique. Je vais essayer d'expliquer comment cela fonctionne sur le même exemple.Puisque tous les nombres que nous testons pour ce motif sont égales ou supérieures à 0x80, le premier octet est toujours de 1, de sorte que le motif est limité à au moins
1xxxxxxxx
. Si nous procédons à un bit par bit ET la comparaison avec11100000
(0xE0), on obtient ce résultat:Donc les bits à la position 5 et 6 (lire en partant de la droite, l'indice a commencé à 0) dépendent de ce que notre nombre actuel est. Avoir que l'égalité de
11000000
, le 5ème morceau doit être0
et le 6ème bit doit être1
:Qui veut dire que les autres éléments de notre numéro peut être arbitraire:
110xxxxx
. Et c'est exactement ce que le modèle de l'article de Wikipédia prévoit pour le premier octet deux octets de caractères mot.Et la dernière l'intérieur
for
boucle est de vérifier la santé mentale de la suite d'octets de caractères multi-octets. Celles-ci doivent commencer par10xxxxxx
.OriginalL'auteur Gumbo
Si vous connaissez un peu l'UTF-8, il est assez simple de mise en œuvre.
Par la voie. Sur le PHP je suppose que c'est un facteur 50 à 100 plus lent que d'une fonction C de sorte que vous ne devriez pas vraiment l'utiliser sur de longues chaînes et les systèmes de production.
OriginalL'auteur Lothar
suis tombé sur ce post, avaient le même problème .. mb_detect_encoding a montré utf-8, mais mb_check_encoding retourné false...
pour le résoudre, pour moi la solution a été:
obtenu à partir de là:
http://board.phpbuilder.com/showthread.php?10368156-mb_check_encoding%28-in_str-quot-UTF-8-quot-%29-return-different-results
sry ne pouvait pas poster le lien correctement....
OriginalL'auteur womd