Quelle est la différence entre encoding et charset?


151

Je suis confus au sujet de l'encodage du texte et du jeu de caractères. Pour de nombreuses raisons, je dois apprendre des trucs non Unicode, non UTF8 dans mes prochains travaux.

Je trouve le mot "charset" dans les en-têtes de courrier électronique comme dans "ISO-2022-JP", mais il n'y a pas un tel encodage dans les éditeurs de texte. (J'ai regardé autour des différents éditeurs de texte.)

Quelle est la différence entre l'encodage de texte et le jeu de caractères? Je vous serais reconnaissant si vous pouviez me montrer quelques exemples de cas d'utilisation.


Réponses:


144

Fondamentalement:

  1. charset est l'ensemble de caractères que vous pouvez utiliser
  2. l'encodage est la façon dont ces caractères sont stockés en mémoire

42
C'est vrai, mais en réalité, "charset" fait généralement référence à la fois au répertoire de caractères et au schéma de codage.
Alan Moore

@AlanMoore En effet, à peu près de la même manière que les gens disent "nombre décimal" pour désigner n'importe quel nombre avec un "séparateur décimal". Ce n'est pas vraiment correct, mais oui, sachez que certaines personnes l'utilisent comme ça.
bvdb

2
Ce n'est pas tout à fait vrai. Par exemple, Unicode fait référence au jeu de caractères, mais il existe plusieurs encodages possibles (UTF-8, UTF-16, UTF-32).
rghome

84

Chaque codage est associé à un jeu de caractères particulier, mais il peut y avoir plus d'un codage pour un jeu de caractères donné. Un jeu de caractères est simplement ce à quoi il ressemble, un jeu de caractères. Il existe un grand nombre de jeux de caractères, dont beaucoup sont destinés à des scripts ou à des langages particuliers.

Cependant, nous sommes bien avancés dans la transition vers Unicode, qui comprend un jeu de caractères capable de représenter presque tous les scripts du monde. Cependant, il existe plusieurs encodages pour Unicode. Un encodage est un moyen de mapper une chaîne de caractères sur une chaîne d'octets. Des exemples de codages Unicode incluent UTF-8 , UTF-16 BE et UTF-16 LE . Chacun de ceux-ci présente des avantages pour des applications ou des architectures de machines particulières.


20
Notez que javadoc utilise à tort "charset" au lieu de "encoding", par exemple dans InputStreamReader , nous lisons "Un InputStreamReader est un pont entre les flux d'octets et les flux de caractères: il lit les octets et les décode en caractères à l'aide d'un jeu de caractères spécifié. Le jeu de caractères qui il utilise peut être spécifié par son nom ou peut être donné explicitement, ou le jeu de caractères par défaut de la plate-forme peut être accepté. " . Cependant, ce qu'ils signifient, c'est «encodage».
David Tonhofer

4
Merci pour votre explication. Unicode est un jeu de caractères et UTF-8 est un moyen de codage d' Unicode , et UTF-16 est un autre moyen de codage d' Unicode .
HongchaoZhang

47

En plus des autres réponses, je pense que cet article est une bonne lecture http://www.joelonsoftware.com/articles/Unicode.html

L'article est intitulé " Le minimum absolu que chaque développeur de logiciel doit absolument, positivement savoir sur Unicode et les jeux de caractères (sans excuses!) " Écrit par Joel Spolsky . L'essai a plus de 10 ans mais (malheureusement) le contenu est toujours valide ...


2
Merci beaucoup d'avoir présenté l'article. Il est un bon.
TK.

9
Cette réponse pourrait être améliorée en expliquant brièvement pourquoi je devrais lire l'article de Joel.
james.garriss

@mattanja Le lien que vous avez fourni est vraiment génial. Merci d'avoir partagé. Voté.
hagrawal

1
Je veux aussi mettre cet excellent article qui est un peu une annexe de Joel Spolsky; kunststube.net/encoding
mkb

Je n'ai pas compris l'article de Joel lors de ma première lecture. J'ai plutôt trouvé ce PowerPoint beaucoup plus clair et précis: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

Un encodage de caractères se compose de:

  1. L'ensemble des caractères pris en charge
  2. Un mappage entre des caractères et des entiers ("points de code")
  3. Comment les points de code sont codés sous la forme d'une série «d'unités de code» (par exemple, unités 16 bits pour UTF-16)
  4. Comment les unités de code sont encodées en octets (par exemple, big-endian ou little-endian)

L'étape n ° 1 en elle-même est un "répertoire de caractères" ou un "jeu de caractères" abstrait, et # 1 + # 2 = un "jeu de caractères codés".

Mais avant que Unicode ne devienne populaire et que tout le monde (sauf les Asiatiques de l'Est) utilisait un encodage à un octet, les étapes 3 et 4 étaient triviales (point de code = unité de code = octet). Ainsi, les protocoles plus anciens ne faisaient pas clairement la distinction entre «encodage de caractères» et «jeu de caractères codés». Les protocoles plus anciens sont utilisés charsetlorsqu'ils signifient vraiment encodage.


serait-ce pourquoi nous pouvons lire charset = 'utf-8' dans la balise META html? parce qu'il a été défini il y a longtemps
Eildosa

26

Jeter plus de lumière pour les personnes qui visitent désormais, j'espère que cela serait utile.


Jeu de caractères

Il y a des caractères dans chaque langue et la collection de ces caractères forme le «jeu de caractères» de cette langue. Lorsqu'un caractère est codé, un identifiant unique ou un numéro appelé comme point de code lui est attribué. En informatique, ces points de code seront représentés par un ou plusieurs octets.

Exemples de jeu de caractères: ASCII (couvre tous les caractères anglais), ISO / CEI 646, Unicode (couvre les caractères de toutes les langues vivantes du monde)

Jeu de caractères codés

Un jeu de caractères codés est un jeu dans lequel un numéro unique est attribué à chaque caractère. Ce numéro unique est appelé "point de code".
Les jeux de caractères codés sont parfois appelés pages de codes.

Codage

L'encodage est le mécanisme permettant de mapper les points de code avec certains octets afin qu'un caractère puisse être lu et écrit uniformément sur différents systèmes en utilisant le même schéma de codage.

Exemples de codage: ASCII, schémas de codage Unicode comme UTF-8, UTF-16, UTF-32.

Élaboration des 3 concepts ci-dessus

  • Considérez ceci - Le caractère 'क' dans le jeu de caractères Devanagari a un point de code décimal de 2325 qui sera représenté par deux octets ( 09 15) lors de l'utilisation du codage UTF-16
  • Dans le schéma de codage «ISO-8859-1», «ü» (ce n'est rien d'autre qu'un caractère dans le jeu de caractères latins) est représenté par une valeur hexadécimale de FCtandis qu'en «UTF-8», il est représenté par C3 BCet en UTF-16 comme FE FF 00 FC.
  • Différents schémas de codage peuvent utiliser le même point de code pour représenter différents caractères, par exemple dans «ISO-8859-1» (également appelé Latin1) la valeur du point de code décimal pour la lettre «é» est 233. Cependant, dans l'ISO 8859-5 , le même point de code représente le caractère cyrillique «щ».
  • D'un autre côté, un point de code unique dans le jeu de caractères Unicode peut en fait être mappé à différentes séquences d'octets, selon le codage utilisé pour le document. Le caractère Devanagari क, avec le point de code 2325 (qui est 915 en notation hexadécimale), sera représenté par deux octets lors de l'utilisation de l'encodage UTF-16 ( 09 15), trois octets avec UTF-8 ( E0 A4 95), ou quatre octets avec UTF-32 ( 00 00 09 15)

11

Un jeu de caractères, ou répertoire de caractères, est simplement un ensemble (une collection non ordonnée) de caractères. Un jeu de caractères codés attribue un entier (un "point de code") à chaque caractère du répertoire. Un codage est un moyen de représenter des points de code sans ambiguïté sous forme de flux d'octets.


Cela devrait être la réponse acceptée. Il définit clairement trois concepts: jeu de caractères, jeu de caractères codés et codage.
Marcus Junius Brutus

6

Googlé pour cela. http://en.wikipedia.org/wiki/Character_encoding

La différence semble subtile. Le terme charset ne s'applique en fait pas à Unicode. Unicode passe par une série d'abstractions. caractères abstraits -> points de code -> codage des points de code en octets.

Les jeux de caractères ignorent cela et sautent directement de caractères en octets. séquence d'octets <-> séquence de caractères

En bref, encodage: points de code -> octets charset: caractères -> octets


5

Un jeu de caractères n'est qu'un ensemble; soit il contient, par exemple, le signe Euro, soit il ne le contient pas. C'est tout.

Un codage est un mappage bijectif d'un jeu de caractères à un ensemble d'entiers. S'il prend en charge le signe Euro, il doit attribuer un entier spécifique à ce caractère et à aucun autre.


Doit-il être bijectif?
Jörg W Mittag

2
Eh bien, l'encodage et le décodage doivent être déterministes, il ne peut donc vraiment pas y avoir de mappages ambigus. Je suppose que vous pourriez avoir un ensemble non contigu d'entiers comme codomaine, mais cela gaspillerait de l'espace lorsque vous stockez du texte, et les ingénieurs détestent l'espace gaspillé.
Kilian Foth

1
Les encodages de caractères hérités ne sont souvent pas bijectifs. Par exemple, dans IBM437, ß et β sont représentés par 0xE1.
dan04

3

À mon avis, un charset fait partie d'un encodage (un composant), l'encodage a un attribut charset, donc un charset peut être utilisé dans de nombreux encodages. Par exemple, unicode est un jeu de caractères utilisé dans des encodages comme UTF-8, UTF-16 et ainsi de suite. Voir l'illustration ici:Voir l'illustration ici

Le char dans charset ne signifie pas le type char dans le monde de la programmation, cela signifie un char dans le monde réel, en anglais c'est peut-être la même chose, mais dans d'autres langues pas, comme le chinois, '我' est un 'char' inséparable dans les jeux de caractères (UNICODE, GB [utilisé dans GBK et GB2312]), 'a' est également un caractère dans les jeux de caractères (ASCII, ISO-8859 , UNICODE).


1

À mon avis, le mot «charset» devrait être limité à l'identification du paramètre utilisé dans HTTP, MIME et des normes similaires pour spécifier un codage de caractères (un mappage d'une série de caractères de texte à une séquence d'octets) par nom. Par exemple:charset=utf-8 .

Je suis conscient, cependant, que MySQL, Java et d'autres endroits peuvent utiliser le mot "charset" pour désigner un encodage de caractères.


1

Un encodage est un mappage entre les octets et les caractères d'un jeu de caractères, il sera donc utile de discuter et de comprendre la différence entre les octets et les caractères .

Considérez les octets comme des nombres entre 0 et 255, alors que les caractères sont des choses abstraites comme "a", "1", "$" et "Ä". L'ensemble de tous les caractères disponibles est appelé un jeu de caractères .

Chaque caractère a une séquence d'un ou plusieurs octets qui sont utilisés pour le représenter; cependant, le nombre et la valeur exacts des octets dépendent du codage utilisé et il existe de nombreux codages différents.

La plupart des encodages sont basés sur un ancien jeu de caractères et un encodage appelés ASCII qui est un octet par caractère (en fait, seulement 7 bits) et contient 128 caractères, y compris un grand nombre des caractères courants utilisés en anglais américain.

Par exemple, voici 6 caractères dans le jeu de caractères ASCII qui sont représentés par les valeurs 60 à 65.

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

Dans l'ensemble ASCII complet, la valeur la plus basse utilisée est zéro et la plus élevée est 127 (les deux sont des caractères de contrôle masqués).

Cependant, une fois que vous commencez à avoir besoin de plus de caractères que l'ASCII de base fournit (par exemple, des lettres avec des accents, des symboles monétaires, des symboles graphiques, etc.), l'ASCII ne convient pas et vous avez besoin de quelque chose de plus complet. Vous avez besoin de plus de caractères (un jeu de caractères différent) et vous avez besoin d'un codage différent car 128 caractères ne suffisent pas pour contenir tous les caractères. Certains codages offrent un octet (256 caractères) ou jusqu'à six octets.

Au fil du temps, de nombreux encodages ont été créés. Dans le monde Windows, il existe CP1252, ou ISO-8859-1, alors que les utilisateurs de Linux ont tendance à privilégier UTF-8. Java utilise UTF-16 de manière native.

Une séquence de valeurs d'octet pour un caractère dans un codage peut représenter un caractère complètement différent dans un autre codage, ou peut même être invalide.

Par exemple, dans la norme ISO 8859-1 , â est représenté par un octet de valeur 226, alors que dans UTF-8 , il est deux octets: 195, 162. Cependant, dans ISO 8859-1 , il y 195, 162aurait deux caractères, Ã, ¢ .

Lorsque les ordinateurs stockent des données sur les caractères en interne ou les transmettent à un autre système, ils stockent ou envoient des octets. Imaginez qu'un système ouvrant un fichier ou recevant un message voit les octets195, 162 . Comment sait-il de quels personnages il s'agit?

Pour que le système interprète ces octets comme des caractères réels (et ainsi les affiche ou les convertit en un autre codage), il doit connaître le codage utilisé. C'est pourquoi l'encodage apparaît dans les en-têtes XML ou peut être spécifié dans un éditeur de texte. Il indique au système le mappage entre les octets et les caractères.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.