strlen () et encodage UTF-8
En supposant que l'encodage UTF-8, et strlen() en PHP, est-il possible que cette chaîne a une longueur de 4?
Je suis seulement intéressé à connaître à propos de strlen(), pas d'autres fonctions
C'est la chaîne: $1�2
Je l'ai testé sur mon propre ordinateur, et j'ai vérifié l'encodage UTF-8, et la réponse que je reçois est 6.
Je ne vois rien dans le manuel pour strlen ou de tout ce que j'ai lu sur UTF-8, ce qui expliquerait pourquoi certains caractères ci-dessus comptent pour moins d'un.
PS: Cette question et de la réponse (4) vient d'une maquette de test pour la ZCE j'ai acheté sur Ebay.
PPS: Merci de me jeter un os et de voter. J'ai fait mes devoirs. Merci d'avance pour toutes les réponses et les votes.
source d'informationauteur Jon Lyles
Vous devez vous connecter pour publier un commentaire.
La chaîne que vous avez posté est de six caractères: $1�2 (signe de dollar, chiffres, lettres minuscules-je avec tréma, la tête en bas point d'interrogation, la moitié de la fraction, deux chiffres)
Si strlen() a été appelé avec un encodage UTF-8 représentation de cette chaîne, vous obtenez un résultat de neuf (probablement, bien qu'il existe plusieurs représentations de différentes longueurs).
Cependant, si nous stocker que chaîne de caractères ISO 8859-1 ou CP1252, nous aurions un six octets de la séquence qui serait légale en tant que UTF-8. Une nouvelle interprétation de ces 6 octets en UTF-8 serait alors le résultat de 4 caractères: $1�2 (signe de dollar, chiffre, Caractère de Remplacement Unicode, chiffre 2). Qui est, le codage UTF-8 du caractère unique '�' est identique à la norme ISO-8859-1 codage des trois personnages "�".
Le caractère de remplacement est souvent inséré lors de l'UTF-8 décodeur lit les données qui n'est pas valide des données UTF-8.
Il semble que la chaîne d'origine a été traitée à travers plusieurs couches de mauvaise interprétation; par l'utilisation de l'UTF-8 décodeur sur la non-UTF-8 données (production de $1�2), et ensuite par ce que vous utilisé pour analyser les données (production de $1�2).
comment sur l'utilisation de mb_strlen() ?
http://lt.php.net/manual/en/function.mb-strlen.php
Mais si vous avez besoin d'utiliser strlen, il est possible de configurer votre serveur web par la mise en mbstring.func_overload directive à 2, donc il va automatiquement remplacer à l'aide de strlen à mb_strlen dans vos scripts.
besoin d'utiliser de Chaîne multi-octets Fonction mb_strlen() comme:
Il est probable qu'à un certain moment entre la préparation de la question et de votre lecture de certains processus de déformation des caractères non-ASCII, donc la question était à l'origine sur certains de chaîne de 4 caractères.
La séquence
�
est obtenu lorsque vous encodez le remplacement de caractères U+FFFD (�) en UTF-8 et interpréter le résultat en latin1. Ce caractère est utilisé comme un remplacement pour les séquences d'octets qui ne sont pas de coder tous les caractères lors de la lecture de texte à partir d'un fichier, par exemple. Ce qui s'est passé est probable que cette:La question d'origine, stockée dans un latin1 fichier texte, eu:
$1¢2
(vous pouvez remplacer ¢ avec tous les caractères non-ASCII)Le fichier a été lu par un programme utilisé est UTF-8. Depuis l'octet correspondant à ¢ ne peut pas être interprétée, le programme a substitué et lire le texte
$1�2
. Ce texte a ensuite été écrits en utilisant UTF-8, résultant en$1\xEF\xBF\xBD2
dans le fichier.Puis une troisième programme qui lit le fichier en latin1, et montre
$1�2
.Pas.
Je vais utiliser une preuve par contradiction.
strlen compte octets, donc avec un strlen de 4, il y aurait besoin d'être exactement 4 octets dans cette chaîne.
L'encodage UTF8 besoins au moins 1 octet par caractère.
Nous avons établi que:
...pourtant, nous avons 6 caractères....ce qui est une contradiction. Donc, pas de.
Cependant, ce n'est pas totalement clair, c'est le jeu de caractères de l'affichage de logiciel(par exemple, le navigateur web) est à l'aide de intepret la chaîne. On pourrait utiliser une rare schéma de codage où un caractère peut être représenté par moins de 8 bits. Si tel était le cas, puis de 4 octets, ne peut afficher que 6 caractères. Ainsi, la chaîne pourrait être utf8, mais le navigateur pourrait décider de l'interpréter comme, disons, 5 bits jeu de caractères.
Nombre de caractères UTF-8 prendre plusieurs octets au lieu d'un. C'est la façon dont l'UTF-8 est construit (C'est comment vous pouvez avoir plusieurs personnages dans un même ensemble).
Essayer
mb_strlen()
à la place.