Que savez-vous du codage des jeux de caractères ASCII, Unicode et UTF-8 ? Cet article vous donnera une compréhension approfondie du codage des jeux de caractères. Cet article présente les problèmes et les conversions d'encodage ASCII, Unicode et UTF-8 ainsi que des exemples d'analyse. Commencez à lire l'article
1. Code ASCII
Nous savons qu'à l'intérieur de l'ordinateur, toute information est finalement une valeur binaire. Chaque bit binaire (bit) a deux états : 0 et 1, donc huit bits binaires peuvent être combinés en 256 états, ce que l'on appelle un octet. En d’autres termes, un octet peut être utilisé pour représenter un total de 256 états différents, et chaque état correspond à un symbole, soit 256 symboles, de 00000000 à 11111111.
Dans les années 1960, les États-Unis ont formulé un ensemble de codages de caractères qui unifiaient la relation entre les caractères anglais et les bits binaires. Cela s'appelait ASCII et est encore utilisé aujourd'hui.
Le code ASCII spécifie un total de 128 encodages de caractères. Par exemple, ESPACE est 32 (binaire 00100000) et la lettre majuscule A est 65 (binaire 01000001). Ces 128 symboles (dont 32 symboles de contrôle non imprimables) n'occupent que les 7 derniers bits d'un octet, et le premier bit est uniformément mis à 0.
Caractères de contrôle ASCII
Caractères affichables ASCII
2. Codage non-ASCII
128 symboles suffisent pour coder l'anglais, mais 128 symboles ne suffisent pas pour représenter d'autres langues. Par exemple, en français, s'il y a un symbole phonétique au-dessus d'une lettre, il ne peut pas être représenté par le code ASCII. En conséquence, certains pays européens ont décidé d’utiliser les bits inactifs les plus élevés des octets pour coder de nouveaux symboles. Par exemple, le codage de é en français est 130 (binaire 10000010). De ce fait, le système de codage utilisé dans ces pays européens peut représenter jusqu'à 256 symboles.
Cependant, un nouveau problème surgit ici. Différents pays ont des lettres différentes, donc même s'ils utilisent tous un codage à 256 symboles, les lettres qu'ils représentent sont différentes. Par exemple, 130 représente é en codage français, représente la lettre Gimel (ג) en codage hébreu et représente un autre symbole en codage russe. Quoi qu’il en soit, dans toutes ces méthodes de codage, les symboles représentés par 0 à 127 sont les mêmes, et la seule différence est la section 128 à 255.
Quant aux caractères des pays asiatiques, ils utilisent encore plus de symboles, avec jusqu'à 100 000 caractères chinois. Un octet ne peut représenter que 256 symboles, ce qui n'est certainement pas suffisant. Plusieurs octets doivent être utilisés pour exprimer un symbole. Par exemple, la méthode de codage courante pour le chinois simplifié est GB2312, qui utilise deux octets pour représenter un caractère chinois, donc théoriquement, elle peut représenter jusqu'à 256 x 256 = 65 536 symboles.
La question de l'encodage chinois nécessite un article spécial pour être discuté, qui n'est pas abordé dans cette note. Il est seulement souligné ici que bien que plusieurs octets soient utilisés pour représenter un symbole, le codage des caractères chinois de la classe GB n'a rien à voir avec l'Unicode et l'UTF-8 décrits plus loin.
3. Unicode
Comme mentionné dans la section précédente, il existe plusieurs méthodes de codage dans le monde, et le même nombre binaire peut être interprété en différents symboles. Par conséquent, si vous souhaitez ouvrir un fichier texte, vous devez connaître sa méthode d'encodage, sinon si vous utilisez la mauvaise méthode d'encodage pour l'interpréter, des caractères tronqués apparaîtront. Pourquoi les e-mails sont-ils souvent tronqués ? En effet, l'expéditeur et le destinataire utilisent des méthodes de codage différentes.
Il est concevable qu'il existe un code qui inclut tous les symboles du monde. Chaque symbole reçoit un code unique, de sorte que le problème des caractères tronqués disparaîtra. Il s'agit d'Unicode, comme son nom l'indique, un encodage de tous les symboles.
Unicode est bien sûr une très grande collection, actuellement dimensionnée pour accueillir plus d'un million de symboles. Le codage de chaque symbole est différent. Par exemple, U+0639 représente la lettre arabe Ain, U+0041 représente la lettre majuscule anglaise A et U+4E25 représente le caractère chinois Yan. Pour une table de correspondance de symboles spécifique, vous pouvez consulter unicode.org ou une table de correspondance de caractères chinois spécialisée.
4. Problèmes avec Unicode
Il convient de noter qu'Unicode n'est qu'un jeu de symboles, il spécifie uniquement le code binaire du symbole. , mais il n'y a aucune spécification quant à la manière dont ce code binaire doit être stocké.
Par exemple, l'Unicode du caractère chinois Yan est le nombre hexadécimal 4E25, qui est converti en un nombre binaire à 15 chiffres (100111000100101). Autrement dit, la représentation de ce symbole nécessite au moins 2 octets. . La représentation d'autres symboles plus grands peut nécessiter 3 ou 4 octets, voire plus.
Il y a deux problèmes sérieux ici La première question est : comment pouvons-nous distinguer Unicode et ASCII ? Comment l’ordinateur sait-il que trois octets représentent un symbole, plutôt que trois symboles distincts ? Le deuxième problème est que nous savons déjà qu'un seul octet suffit pour représenter les lettres anglaises. Si Unicode stipule uniformément que chaque symbole est représenté par trois ou quatre octets, alors chaque lettre anglaise doit être précédée de deux caractères. ce qui représente un énorme gaspillage de stockage, et la taille du fichier texte sera deux ou trois fois plus grande, ce qui est inacceptable.
Les résultats qu'ils provoquent sont : 1) Plusieurs méthodes de stockage d'Unicode ont émergé, ce qui signifie qu'il existe de nombreux formats binaires différents qui peuvent être utilisés pour représenter Unicode. 2) Unicode n'a pas pu être promu pendant longtemps jusqu'à l'émergence d'Internet.
5. UTF-8
La popularité d'Internet nécessite fortement l'émergence d'une méthode d'encodage unifiée. UTF-8 est l'implémentation Unicode la plus utilisée sur Internet. D'autres implémentations incluent UTF-16 (les caractères sont représentés par deux ou quatre octets) et UTF-32 (les caractères sont représentés par quatre octets), mais celles-ci sont rarement utilisées sur Internet. Encore une fois, le lien ici est que UTF-8 est une implémentation d'Unicode.
L'une des principales caractéristiques de l'UTF-8 est qu'il s'agit d'une méthode de codage de longueur variable. Il peut utiliser 1 à 4 octets pour représenter un symbole, et la longueur des octets varie en fonction des différents symboles.
Les règles d'encodage de l'UTF-8 sont très simples, il n'y en a que deux :
1 Pour les symboles à un octet, le premier bit de l'octet est défini. à 0, et les suivants Les 7 bits sont le code Unicode de ce symbole. Ainsi, pour les lettres anglaises, l’encodage UTF-8 et l’encodage ASCII sont les mêmes.
2. Pour les symboles de n octets (n > 1), les n premiers bits du premier octet sont mis à 1, le n + 1ème bit est mis à 0 et les deux premiers bits du les octets suivants sont mis à 0. Les bits sont toujours mis à 10. Les bits binaires restants non mentionnés sont tous le code Unicode de ce symbole.
Le tableau suivant résume les règles d'encodage, la lettre x indique les bits d'encodage disponibles.
D'après le tableau ci-dessus, l'interprétation de l'encodage UTF-8 est très simple. Si le premier bit d'un octet est 0, alors l'octet seul est un caractère ; si le premier bit est 1, le nombre de 1 consécutifs indique le nombre d'octets occupés par le caractère actuel.
Ensuite, nous prendrons le caractère chinois Yan comme exemple pour montrer comment implémenter l'encodage UTF-8.
L'Unicode de Yan est 4E25 (100111000100101). D'après le tableau ci-dessus, on peut constater que 4E25 est dans la plage de la troisième ligne (0000 0800 - 0000 FFFF), donc UTF-8 de Yan. le codage nécessite trois octets, c'est-à-dire que le format est 1110xxxx 10xxxxxx 10xxxxxx. Ensuite, en commençant par le dernier chiffre binaire de Yan, remplissez le x au format de l'arrière vers l'avant et remplissez les bits supplémentaires avec 0. De cette façon, nous obtenons que le codage UTF-8 de Yan est 11100100 10111000 10100101, qui converti en hexadécimal est E4B8A5.
6. Conversion entre Unicode et UTF-8
À travers l'exemple de la section précédente, vous pouvez voir que le code Unicode de Yan est 4E25. , le codage UTF-8 est E4B8A5, les deux sont différents. La conversion entre eux peut être réalisée grâce à des programmes.
Pour la plate-forme Windows, l'une des méthodes de conversion les plus simples consiste à utiliser l'applet du bloc-notes intégré notepad.exe. Après avoir ouvert le fichier, cliquez sur la commande Enregistrer sous dans le menu Fichier et une boîte de dialogue apparaîtra avec une barre déroulante de codage en bas.
Il y a quatre options à l'intérieur : ANSI, Unicode, Unicode big endian et UTF-8.
ANSI est l'encodage par défaut. Pour les fichiers anglais, il s'agit de l'encodage ASCII, et pour les fichiers en chinois simplifié, il s'agit de l'encodage GB2312 (uniquement pour la version chinoise simplifiée de Windows, s'il s'agit de la version chinoise traditionnelle, le code Big5 sera utilisé).
Le codage Unicode fait ici référence à la méthode de codage UCS-2 utilisée par notepad.exe, c'est-à-dire que deux octets sont utilisés pour stocker directement le code Unicode du caractère. format petit endian.
L'encodage Unicode big endian correspond à l'option précédente. J'expliquerai la signification du petit-boutiste et du gros-boutiste dans la section suivante.
Encodage UTF-8, qui est la méthode d'encodage décrite dans la section précédente.
Après avoir sélectionné la « méthode d'encodage », cliquez sur le bouton « Enregistrer » et la méthode d'encodage du fichier sera immédiatement convertie.
7. Little endian et Big endian
Comme mentionné dans la section précédente, le format UCS-2 peut stocker des codes Unicode (les points de code sont pas pareil) dépasse 0xFFFF). En prenant le caractère chinois Yan comme exemple, le code Unicode est 4E25 et doit être stocké sur deux octets, un octet est 4E et l'autre octet est 25. Lors du stockage, 4E est à l'avant et 25 à l'arrière, ce qui est la méthode Big endian ; 25 est à l'avant et 4E est à l'arrière, ce qui est la méthode Little endian.
Ces deux noms étranges viennent des "Voyages de Gulliver" de l'écrivain britannique Swift. Dans le livre, une guerre civile a éclaté à Lilliput. La cause de la guerre était le conflit entre les gens pour savoir s'il fallait casser les œufs du gros-boutiste ou du petit-boutiste. À cause de cet incident, six guerres ont éclaté, un empereur a perdu la vie et un autre empereur a perdu son trône.
Le premier octet vient en premier, qui est "Big endian", et le deuxième octet vient en premier, qui est "Little endian".
Alors naturellement, une question se posera : comment l'ordinateur sait-il quelle méthode d'encodage est utilisée pour un certain fichier ?
La spécification Unicode définit qu'un caractère indiquant la séquence d'encodage est ajouté au début de chaque fichier. Le nom de ce caractère est appelé "espace sans coupure de largeur nulle" (zero width no-break space), représenté par la FEFF. Cela fait exactement deux octets et FF est supérieur d'un à FE.
Si les deux premiers octets d'un fichier texte sont FE FF, cela signifie que le fichier utilise le mode big-endian ; si les deux premiers octets sont FF FE, cela signifie que le fichier utilise le mode small-endian.
8. Exemple
Ce qui suit est un exemple.
Ouvrez le programme "Notepad" notepad.exe, créez un nouveau fichier texte, le contenu est le mot "yan", et enregistrez-le en ANSI, Unicode, Unicode big endian et encodage UTF-8.
Ensuite, utilisez la « fonction Hex » du logiciel d'édition de texte UltraEdit pour observer l'encodage interne du fichier.
ANSI : L'encodage du fichier est de deux octets D1 CF, qui est l'encodage GB2312 de Yan, ce qui implique également que GB2312 est stocké en mode grosse tête.
Unicode : L'encodage est de quatre octets FF FE 25 4E, où FF FE indique qu'il est stocké en mode petit endian, et l'encodage réel est 4E25.
Big endian Unicode : le codage est de quatre octets FE FF 4E 25, où FE FF indique un stockage de grande taille.
UTF-8 : Le codage est de six octets EF BB BF E4 B8 A5. Les trois premiers octets EF BB BF indiquent qu'il s'agit d'un codage UTF-8 et les trois derniers octets sont. E4B8A5 Encodage spécifique de Yan, son ordre de stockage est cohérent avec l'ordre d'encodage.
9. Lectures approfondies (connaissances parascolaires)
Le minimum absolu que tout développeur de logiciels doit absolument et positivement connaître Unicode et jeux de caractères (les connaissances les plus élémentaires sur les jeux de caractères)
Parlez de l'encodage Unicode : RFC3629 : UTF-8, un format de transformation ISO 10646 (si les réglementations UTF-8 sont implémentées)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!