Comment un fichier avec des caractères Chinois connaître le nombre d'octets à utiliser par caractère?
J'ai lu Joël article "Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!)" mais encore ne pas comprendre tous les détails. Un exemple permettra d'illustrer mes questions. Regardez ce fichier ci-dessous:
(source: yart.com.au)
J'ai ouvert le fichier dans un éditeur binaire pour examiner de près la dernière des trois d'un côté du premier caractère Chinois:
(source: yart.com.au)
Selon Joel:
En UTF-8, chaque point de code de 0 à 127 est stocké dans un octet. Seuls les points de code 128 et ci-dessus sont stockées à l'aide de 2, 3, en fait, jusqu'à 6 octets.
Le fait de l'éditeur de dire:
- E6 (230) est au-dessus de point de code 128.
- Donc je vais interpréter les suivantes octets soit 2, 3, en fait, jusqu'à 6 octets.
Si oui, ce qui indique que l'interprétation est plus que de 2 octets? Comment cela est-il indiqué par les octets qui suivent E6?
Est mon caractère Chinois stockées dans les 2, 3, 4, 5 ou 6 octets?
- Les deux octets vous l'avez souligné dans votre éditeur hexadécimal sont deux octets de un à trois octets de caractères.
- Notez que Joel de l'information est un peu hors de date: UTF-8 utilise un maximum de quatre octets par caractère, et non pas six. Il a été initialement conçu pour encoder un potentiel de 2^31 caractères, mais il a été réduit en 2003 de gérer simplement la gamme couverte par l'Unicode définition, U+0000 à U+10FFFF.
Vous devez vous connecter pour publier un commentaire.
Si l'encodage est UTF-8, alors le tableau suivant montre la façon dont un point de code Unicode (jusqu'à 21 bits) est converti en UTF-8:
Il y a un certain nombre de non-valeurs autorisées - en particulier, les octets 0xC1, 0xC2, et 0xF5 - 0xFF n'apparaissent jamais dans bien formé UTF-8. Il y a également un certain nombre d'autres verboten combinaisons. Les irrégularités sont dans le 1er et 2ème octet octet colonnes. Notez que les codes U+D800 - U+DFFF sont réservés pour l'UTF-16 de mères porteuses et ne peut pas apparaître en UTF-8 valide.
Ces tables sont levées à partir de la Unicode version standard 5.1.
Dans la question, le matériau de décalage 0x0010 .. 0x008F rendements:
Tout cela fait partie de l'encodage UTF8 (qui n'est qu'un schéma de codage d'Unicode).
La taille peut compris en examinant le premier octet comme suit:
"10" (0x80-0xbf)
, ce n'est pas le premier octet d'une séquence et vous devez sauvegarder jusqu'à ce que vous trouver le début, toutes les octets qui commence par "0" ou "11" (merci à Jeffrey Hantin de remarquer que dans les commentaires)."0" (0x00-0x7f)
, il est de 1 octet."110" (0xc0-0xdf)
, c'est de 2 octets."1110" (0xe0-0xef)
, c'est 3 octets."11110" (0xf0-0xf7)
, c'est 4 octets.Je vais dupliquer le tableau, mais l'original est sur la Wikipédia UTF8 page ici.
Les caractères Unicode dans le tableau ci-dessus sont construits à partir des bits:
où la
z
ety
bits sont supposé être égal à zéro où ils ne sont pas donnés. Certains octets sont considérées comme illégales comme un octet de départ, car ils sont soit:En outre, à la suite d'octets dans un multi-séquence d'octets qui ne commencent pas par des bits "10" sont illégales.
Considérez, par exemple, la séquence [0xf4,0x8a,0xaf,0x8d]. C'est un 4-séquence d'octets que le premier octet tombe entre 0xf0 et 0xf7.
Pour votre requête spécifique avec le premier octet 0xe6 (longueur = 3), la séquence d'octets est:
Si vous le cherchez dans le code ici, vous verrez que c'est celui que vous aviez dans votre question: 澳.
De montrer comment le décodage fonctionne, je suis retourné à mes archives pour retrouver mon UTF8 code de traitement. J'ai eu à se transformer un peu pour en faire un programme complet et le codage a été supprimé (car la question était vraiment sur le décodage), donc j'espère que je n'ai pas introduit des erreurs de la couper et coller:
Vous pouvez l'exécuter avec votre séquence d'octets (vous aurez besoin de 4 donc l'utilisation de 0 à pavé de sortir) comme suit:
Une excellente référence pour ce qui est Markus Kuhn UTF-8 Unicode et FAQ.
Essentiellement, s'il commence par un 0, c'est un 7 bits de code de point. Si elle commence par 10, c'est une continuation d'un multi-octets codepoint. Autrement, le nombre de 1 est vous dire combien d'octets de ce point de code est codé comme.
Le premier octet indique combien d'octets encoder le point de code.
0xxxxxxx 7 bits de point de code codé en 1 octets
110xxxxx 10xxxxxx 10 bits de point de code codé sur 2 octets
110xxxxx 10xxxxxx 10xxxxxx etc.
1110xxxx
11110xxx
etc.
3 octets
http://en.wikipedia.org/wiki/UTF-8#Description
UTF-8 est construit de façon telle qu'il n'y a pas d'ambiguïté possible sur l'endroit où un personnage commence et combien d'octets il a.
C'est vraiment simple.
UTF-8 a beaucoup de redondance.
Si vous voulez savoir combien d'octets de long d'un personnage, il y a de multiples façons de dire.
Quelques octets ne sont jamais utilisées, comme 0xC1 à 0xC2 ou 0xF5 à 0xFF, donc si vous rencontrez ces octets n'importe où, alors vous n'êtes pas à la recherche à l'UTF-8.
Points de Code jusqu'à 0x7ff est stockée sous forme de 2 octets; jusqu'à 0xffff que 3 octets; tout le reste que 4 octets. (Techniquement, jusqu'à 0x1fffff, mais le plus codepoint autorisés dans Unicode est 0x10ffff.)
Lors du décodage, le premier octet de la multi-octet de la séquence est utilisée pour déterminer le nombre d'octets utilisés pour rendre la séquence:
110x xxxx
=> 2-séquence d'octets1110 xxxx
=> 3-séquence d'octets1111 0xxx
=> 4-séquence d'octetsTous les octets de la séquence doit s'adapter à la
10xx xxxx
modèle.L'astuce est dans cette phrase ici:
Chaque point de code jusqu'à 127 a le haut ensemble de bits à zéro. Par conséquent, l'éditeur sait que si elle rencontre un octet où le premier bit est à 1, c'est le début d'un de caractères multi-octets.
pourquoi il y a autant compliqué réponses?
3 octets pour 1 caractère Chinois. l'utilisation de cette fonction( sous jQuery) :