UTF-8 : Unicode TransformationFormat-8bit, la nomenclature est autorisée, mais la nomenclature n'est généralement pas incluse. Il s'agit d'un codage multi-octets utilisé pour résoudre les caractères internationaux. Il utilise 8 bits (soit un octet) pour l'anglais et 24 bits (trois octets) pour le chinois. UTF-8 contient des caractères utilisés par tous les pays du monde. Il s’agit d’un codage international doté d’une grande polyvalence. Le texte codé en UTF-8 peut être affiché sur les navigateurs de divers pays prenant en charge le jeu de caractères UTF8. Par exemple, s'il s'agit d'un encodage UTF8, le chinois peut également être affiché sur l'IE anglais des étrangers, et ils n'ont pas besoin de télécharger le package de prise en charge de la langue chinoise d'IE.
GBK est une norme basée sur la norme nationale GB2312 et étendue pour être compatible avec GB2312. Le codage de texte de GBK est représenté par des octets doubles, c'est-à-dire que les caractères chinois et anglais sont représentés par des octets doubles. Afin de distinguer les caractères chinois, les bits les plus élevés sont définis sur 1. GBK contient tous les caractères chinois et constitue un codage national. Il est moins polyvalent que UTF8, mais UTF8 occupe une base de données plus grande que GBD.
GBK, GB2312, etc. doivent être convertis en UTF8 via l'encodage Unicode :
GBK, GB2312--Unicode--UTF8
UTF8--Unicode--GBK, GB2312
Pour un site web ou un forum, s'il y a beaucoup de caractères anglais, il est recommandé d'utiliser UTF-8 pour gagner de la place. Cependant, de nombreux plug-ins de forum ne prennent désormais généralement en charge que GBK.
Explication détaillée de la différence entre les codages. En termes simples, les codes Unicode, GBK et Big Five sont les valeurs codées, et utf-8, uft-16 et similaires sont les expressions de cette valeur. Les trois codes précédents sont compatibles. Pour un même caractère chinois, les trois valeurs de code sont complètement différentes. Par exemple, la valeur non codée de « Han » est différente de gbk. Supposons que la valeur non codée soit a040 et que gbk soit b030, et que le code uft-8 soit la forme sous laquelle cette valeur est exprimée. Le code utf-8 est entièrement organisé uniquement pour le décodage. Si GBK veut être converti en UTF-8, il doit d'abord être converti en décodage, puis converti en utf-8 et c'est OK.
Pour plus de détails, voir l’article réimprimé ci-dessous.
Parlons du codage Unicode et expliquons brièvement les termes tels que UCS, UTF, BMP et BOM. Il s'agit d'une lecture intéressante écrite par des programmeurs pour des programmeurs. Ce qu'on appelle le plaisir signifie que vous pouvez facilement comprendre certains concepts auparavant peu clairs et améliorer vos connaissances, ce qui est similaire à la mise à niveau dans un jeu RPG. La motivation pour organiser cet article est deux questions :
Première question :
En utilisant « Enregistrer sous » dans le Bloc-notes Windows, vous pouvez effectuer une conversion entre les méthodes d'encodage GBK, Unicode, Unicode big endian et UTF-8. Ou vous pouvez accéder directement à http://www.knowsky.com/tools/utf8.asp pour une conversion en ligne.
Il s'agit également d'un fichier txt. Comment Windows identifie-t-il la méthode d'encodage ?
J'ai découvert il y a longtemps que les fichiers txt codés Unicode, Unicode bigendian et UTF-8 auront quelques octets supplémentaires au début, qui sont FF, FE (Unicode), FE, FF (Unicode bigendian), EF, BB, BF. (UTF-8). Mais sur quels critères se basent ces marqueurs ?
Deuxième question :
Récemment, j'ai vu ConvertUTF.c sur Internet, qui réalise la conversion mutuelle de UTF-32, UTF-16 et UTF-8. Je connais déjà les méthodes d'encodage telles que Unicode (UCS2), GBK et UTF-8. Mais ce programme me rend un peu confus et je ne me souviens pas de la relation entre UTF-16 et UCS2.
Après avoir vérifié les informations pertinentes, j'ai finalement clarifié ces problèmes et j'ai également appris quelques détails sur Unicode. Écrivez un article et envoyez-le à des amis qui ont des questions similaires. Cet article est rédigé de la manière la plus simple à comprendre possible, mais les lecteurs doivent savoir ce que sont les octets et ce qu'est l'hexadécimal.
0. big endian et petit endian
big endian et little endian sont des méthodes différentes par lesquelles le processeur gère les nombres multi-octets. Par exemple, le codage Unicode du caractère « 汉 » est 6C49. Ainsi, lors de l'écriture dans un fichier, faut-il écrire 6C devant ou 49 devant ? Si 6C est écrit devant, c’est big endian. Si 49 est écrit devant, c'est Little Endian.
Le mot « endian » vient des « Voyages de Gulliver ». La guerre civile à Lilliput a été provoquée par la question de savoir s'il fallait casser les œufs du Big-Endian ou du Little-Endian. En conséquence, il y a eu six rébellions. Un empereur a perdu la vie et un autre a perdu le trône.
Nous traduisons généralement endian par « ordre des octets », et big endian et little endian sont appelés « big end » et « little end ».
1. Codage des caractères et code interne À propos, les caractères de codage des caractères chinois doivent être codés avant de pouvoir être traités par l'ordinateur. La méthode de codage par défaut utilisée par l'ordinateur est le code interne de l'ordinateur. Les premiers ordinateurs utilisaient le codage ASCII 7 bits Afin de traiter les caractères chinois, les programmeurs ont conçu le GB2312 pour le chinois simplifié et le big5 pour le chinois traditionnel.
Les RFC2781 et RFC3629 de l'IETF décrivent les méthodes de codage UTF-16 et UTF-8 de manière claire, précise et rigoureuse dans le style cohérent de la RFC. J'oublie toujours que IETF est l'abréviation de Internet Engineering Task Force. Cependant, la RFC maintenue par l'IETF constitue la base de toutes les spécifications sur Internet.
2.1. Code interne et page de codes
Actuellement, le noyau Windows prend déjà en charge le jeu de caractères Unicode, de sorte que le noyau peut prendre en charge toutes les langues du monde. Cependant, étant donné qu'un grand nombre de programmes et de documents existants utilisent un certain codage de langage, tel que GBK, il est impossible pour Windows de ne pas prendre en charge le codage existant et d'utiliser tous Unicode.
Windows utilise des pages de codes pour s'adapter à différents pays et régions. La page de codes peut être comprise comme le code interne mentionné précédemment. La page de codes correspondant à GBK est CP936.
Microsoft définit également une page de codes pour GB18030 : CP54936. Cependant, étant donné que GB18030 a des codages sur 4 octets et que la page de codes Windows ne prend en charge que les codages sur un octet et deux octets, cette page de codes ne peut pas vraiment être utilisée.
3. UCS-2, UCS-4, BMP
UCS est disponible en deux formats : UCS-2 et UCS-4. Comme son nom l'indique, UCS-2 est codé sur deux octets et UCS-4 est codé sur 4 octets (en fait, seuls 31 bits sont utilisés, le bit le plus élevé doit être 0). Faisons quelques jeux mathématiques simples :
UCS-2 a 2^16=65536 points de code et UCS-4 a 2^31=2147483648 points de code.
UCS-4 est divisé en 2 ^ 7 = 128 groupes selon l'octet le plus élevé, le bit le plus élevé étant 0. Chaque groupe est divisé en 256 plans en fonction de l'octet suivant le plus élevé. Chaque plan est divisé en 256 lignes selon le troisième octet, et chaque ligne contient 256 cellules. Bien entendu, les cellules d’une même ligne ne diffèrent que par le dernier octet, et le reste est identique.
Le plan 0 du groupe 0 est appelé plan multilingue de base, ou BMP. Ou dans UCS-4, les bits de code dont les deux octets supérieurs sont 0 sont appelés BMP.
UCS-2 est obtenu en supprimant les deux premiers octets zéro du BMP d'UCS-4. Ajoutez deux octets zéro devant les deux octets de l'UCS-2 pour obtenir le BMP de l'UCS-4. Aucun caractère n'est alloué en dehors du BMP dans la spécification UCS-4 actuelle.
4. Encodage UTF
UTF-8 code UCS en unités de 8 bits. L'encodage d'UCS-2 vers UTF-8 est le suivant :
Encodage UCS-2 (hexadécimal) Flux d'octets UTF-8 (binaire)
0000-007F 0xxxxxxx
0080-07FF 110xxxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
Par exemple, le codage Unicode du « chinois » est 6C49. 6C49 est compris entre 0800 et FFFF, vous devez donc utiliser un modèle de 3 octets : 1110xxxx 10xxxxxx10xxxxxx. L'écriture de 6C49 en binaire est : 0110 110001 001001. En utilisant ce flux binaire pour remplacer x dans le modèle à son tour, nous obtenons : 1110011010110001 10001001, soit E6 B1 89.
Les lecteurs peuvent utiliser le Bloc-notes pour tester si notre codage est correct. Il convient de noter qu'UltraEdit sera automatiquement converti en UTF-16 lors de l'ouverture d'un fichier texte codé en UTF-8, ce qui peut prêter à confusion. Vous pouvez désactiver cette option dans les paramètres. Un meilleur outil est Hex Workshop.
UTF-16 code UCS en unités de 16 bits. Pour les codes UCS inférieurs à 0x10000, l'encodage UTF-16 est égal à l'entier non signé de 16 bits correspondant au code UCS. Pour les codes UCS d'au moins 0x10000, un algorithme est défini. Cependant, étant donné que le BMP de l'UCS2 ou de l'UCS4 réellement utilisé doit être inférieur à 0x10000, on peut pour l'instant considérer que UTF-16 et UCS-2 sont fondamentalement identiques. Cependant, UCS-2 n'est qu'un schéma de codage et UTF-16 est utilisé pour la transmission réelle, la question de l'ordre des octets doit donc être prise en compte.
5. Ordre des octets UTF et nomenclature
UTF-8 utilise les octets comme unité de codage et ne présente aucun problème d'endianité. UTF-16 utilise deux octets comme unité de codage. Avant d'interpréter un texte UTF-16, vous devez d'abord comprendre l'ordre des octets de chaque unité de codage. Par exemple, le codage Unicode de « Kui » est 594E et le codage Unicode de « B » est 4E59. Si nous recevons le flux d'octets UTF-16 « 594E », s'agit-il de « Ku » ou de « B » ?
La méthode recommandée pour marquer l'ordre des octets dans la spécification Unicode est la nomenclature. La nomenclature n'est pas la liste de nomenclature de la « nomenclature », mais la marque d'ordre des octets. BOM est une petite idée astucieuse :
Il existe un caractère appelé "ZERO WIDTH NO-BREAKSPACE" dans le codage UCS, et son codage est FEFF. FFFE est un caractère qui n'existe pas dans UCS, il ne devrait donc pas apparaître dans la transmission réelle. La spécification UCS recommande de transmettre les caractères "ZERO WIDTH NO-BREAK SPACE" avant de transmettre le flux d'octets.
De cette façon, si le récepteur reçoit FEFF, cela indique que le flux d'octets est Big-Endian ; s'il reçoit FFFE, cela indique que le flux d'octets est Little-Endian. C'est pourquoi le caractère "ZERO WIDTH NO-BREAK SPACE" est également appelé BOM.
UTF-8 ne nécessite pas de nomenclature pour indiquer l'ordre des octets, mais peut utiliser la nomenclature pour indiquer la méthode de codage. Le codage UTF-8 du caractère « ZERO WIDTH NO-BREAKSPACE » est EF BB BF (les lecteurs peuvent le vérifier en utilisant la méthode de codage que nous avons présentée précédemment). Ainsi, si le récepteur reçoit un flux d'octets commençant par EF BBBF, il sait qu'il est codé en UTF-8.
Windows utilise BOM pour marquer l'encodage des fichiers texte.
6. Autres documents de référence Le principal document de référence pour cet article est le « Bref aperçu de l'ISO-IEC 10646 et d'Unicode » ( http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html ).
J’ai également trouvé deux informations qui semblaient intéressantes, mais comme j’avais déjà les réponses à mes questions initiales, je ne les ai pas lu :
"Comprendre Unicode Une introduction générale au standard Unicode" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a )
"Bases du codage des jeux de caractères Comprendre les codages des jeux de caractères et les codages hérités" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03 )
J'ai écrit des progiciels pour convertir UTF-8, UCS-2 et GBK les uns vers les autres, y compris des versions utilisant l'API Windows et des versions qui n'utilisent pas l'API Windows. Si j'ai le temps à l'avenir, je ferai le tri et le mettrai sur ma page d'accueil personnelle ( http://fmddlmyy.home4u.china.com ).
J'ai commencé à écrire cet article après avoir réfléchi à tous les problèmes. Je pensais pouvoir le terminer dans un moment. De façon inattendue, il a fallu beaucoup de temps pour réfléchir au libellé et vérifier les détails, et je l'ai écrit de 13h30 à 21h00. J'espère que certains lecteurs pourront en profiter.
Annexe 1 Parlons du code de localisation, GB2312, du code interne et de la page de codes. Certains amis ont encore des questions sur cette phrase dans l'article :
"Le texte original du GB2312 est toujours l'indicatif régional. De l'indicatif régional au code interne, vous devez ajouter A0 respectivement à l'octet de poids fort et à l'octet de poids faible."
Laissez-moi vous l'expliquer en détail :
« Le texte original du GB2312 » fait référence à une norme nationale de 1980, « Ensemble de base de jeux de caractères codés chinois pour l'échange d'informations standard national de la République populaire de Chine GB2312-80 ». Cette norme utilise deux nombres pour coder les caractères chinois et les symboles chinois. Le premier nombre est appelé « zone » et le deuxième nombre est appelé « bit ». C'est pourquoi on l'appelle aussi code de localisation. Les zones 1 à 9 sont des symboles chinois, les zones 16 à 55 sont des caractères chinois de premier niveau et les zones 56 à 87 sont des caractères chinois de deuxième niveau. Désormais, Windows dispose également d'une méthode de saisie d'emplacement, par exemple, saisissez 1601 pour obtenir « ah ». (Cette méthode de saisie de localisation peut reconnaître automatiquement les codes de localisation hexadécimaux GB2312 et décimaux, ce qui signifie que la saisie de B0A1 obtiendra également « ah ».)
Le code interne fait référence au codage des caractères dans le système d'exploitation. Le code interne des premiers systèmes d'exploitation dépendait de la langue. Windows d'aujourd'hui prend en charge Unicode dans le système, puis utilise des pages de codes pour s'adapter à différentes langues. Le concept de « code interne » est relativement vague. Microsoft fait généralement référence au codage spécifié par la page de codes par défaut comme étant du code interne.
Il n’existe pas de définition officielle du terme code interne, et page de codes n’est que le nom de la société Microsoft. En tant que programmeurs, tant que nous savons de quoi il s’agit, il n’est pas nécessaire de trop examiner ces termes.
La page de codes (page de codes) est le codage des caractères d'une langue. Par exemple, la page de codes de GBK est CP936, la page de codes de BIG5 est CP950 et la page de codes de GB2312 est CP20936.
Windows a le concept de page de codes par défaut, c'est-à-dire quel encodage est utilisé par défaut pour interpréter les caractères. Par exemple, le Bloc-notes Windows ouvre un fichier texte et le contenu à l'intérieur est un flux d'octets : BA, BA, D7, D6. Comment Windows doit-il l’interpréter ?
Doit-il être interprété conformément au codage Unicode, GBK, BIG5 ou ISO8859-1 ? Si vous l'interprétez selon GBK, vous obtiendrez le mot « caractères chinois ». Selon d'autres interprétations de codage, le caractère correspondant peut ne pas être trouvé ou un mauvais caractère peut être trouvé. La soi-disant « erreur » signifie qu'elle est incompatible avec l'intention originale de l'auteur du texte et que des caractères tronqués sont produits.
La réponse est que Windows interprète le flux d'octets dans le fichier texte selon la page de codes par défaut actuelle. La page de codes par défaut peut être définie via les options régionales du Panneau de configuration. Il existe un élément ANSI dans Enregistrer sous du Bloc-notes, qui enregistre en fait selon la méthode de codage de la page de codes par défaut.
Le code interne de Windows est Unicode, qui peut techniquement prendre en charge plusieurs pages de codes en même temps. Tant que le fichier peut expliquer le codage qu'il utilise et que l'utilisateur a installé la page de codes correspondante, Windows peut l'afficher correctement. Par exemple, le jeu de caractères peut être spécifié dans un fichier HTML.
Certains auteurs de fichiers HTML, en particulier les auteurs anglais, pensent que tout le monde utilise l'anglais et ne spécifient pas de jeu de caractères dans le fichier. S'il utilise des caractères compris entre 0x80 et 0xff et que Windows chinois les interprète selon le GBK par défaut, des caractères tronqués apparaîtront. À ce stade, ajoutez simplement l'instruction spécifiant charset au fichier html, par exemple :
<méta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
Si la page de codes utilisée par l'auteur original est compatible avec ISO8859-1, il n'y aura aucun caractère tronqué.
Parlons du code de localisation. Le code de localisation d'Ah est 1601, soit 0x10, 0x01 en hexadécimal. Cela entre en conflit avec le codage ASCII largement utilisé par les ordinateurs. Afin d'être compatible avec le codage ASCII de 00-7f, nous ajoutons respectivement A0 aux octets hauts et bas de l'indicatif régional. De cette façon, le code de « ah » devient B0A1. Nous appelons également l'encodage avec deux A0 ajoutés comme encodage GB2312, bien que le texte original de GB2312 ne le mentionne pas du tout.