web-dev-qa-db-fra.com

Quelle est la différence entre l'encodage et le jeu de caractères?

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 mon prochain travail.

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 de bien vouloir me montrer quelques exemples de cas d'utilisation.

137
TK.

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
128
Svetlozar Angelov

Chaque codage est associé à un jeu de caractères particulier, mais il peut y avoir plusieurs codages pour un jeu de caractères donné. Un jeu de caractères est simplement ce à quoi il ressemble, un ensemble 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 TF-8 , TF-16 BE et TF-16 LE . Chacun d'eux présente des avantages pour des applications ou des architectures de machine particulières.

79
Matthew Flaschen

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 tout développeur de logiciels doit absolument connaître positivement sur l'Unicode et les jeux de caractères (pas d'excuses!) " écrit par Joel Spolsky . L'essai a plus de 10 ans mais (malheureusement) le contenu est toujours valable ...

45
mattanja

Un codage de caractères comprend:

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

L'étape # 1 est en soi 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 qu'Unicode ne devienne populaire et que tout le monde (sauf les Asiatiques de l'Est) utilisait un codage à un octet, les étapes # 3 et # 4 étaient triviales (point de code = unité de code = octet). Ainsi, les anciens protocoles ne faisaient pas clairement la distinction entre "codage de caractères" et "jeu de caractères codés". Les protocoles plus anciens utilisent charset lorsqu'ils signifient vraiment un encodage.

26
dan04

Donner plus de lumière aux personnes visitant désormais, j'espère que ce serait utile.


Character Set

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é, il a attribué un identifiant ou un numéro unique appelé point de code. En informatique, ces points de code seront représentés par un ou plusieurs octets.

Exemples de jeux de caractères: ASCII (couvre tous les caractères anglais), ISO/IEC 646, Unicode (couvre les caractères de toutes les langues vivantes dans le 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 pour mapper les points de code avec quelques 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 d'encodage.

Exemples d'encodage: ASCII, schémas d'encodage Unicode comme UTF-8, UTF-16, UTF-32.

Elaboration des 3 concepts ci-dessus

  • Considérez ceci - Le caractère 'क' dans Devanagari jeu de caractères a une décimale point de code de 2325 qui sera représenté par deux octets (09 15) lors de l'utilisation de encodage 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 latin) est représenté comme une valeur hexadécimale de FC tandis que dans "UTF-8", il est représenté comme C3 BC et 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 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é sur 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 du codage UTF-16 (09 15), trois octets avec UTF-8 (E0 A4 95), ou quatre octets avec UTF-32 (00 00 09 15)
19
hagrawal

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 sans ambiguïté des points de code sous la forme d'un flux d'octets.

10
Jonathan Feinberg

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

La différence semble être subtile. Le terme charset ne s'applique 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 sautent réellement ceci et passent directement des caractères aux octets. séquence d'octets <-> séquence de caractères

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

6
Fakrudeen

Un jeu de caractères n'est qu'un ensemble; il contient, par exemple le signe Euro, sinon il ne le fait 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.

5
Kilian Foth

À mon avis, le mot "charset" devrait se limiter à identifier le paramètre utilisé dans HTTP, MIME et les 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 codage de caractères.

1
Peter O.

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

Considérez les octets comme des nombres entre 0 et 255, tandis que les caractères sont des choses abstraites comme "a", "1", "$" et "Ä". L'ensemble de tous les caractères disponibles est appelé 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é ASCII qui est un seul octet par caractère (en fait, seulement 7 bits) et contient 128 caractères, dont un grand nombre des caractères communs utilisés aux États-Unis. Anglais.

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 complet ASCII set, 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 cachés).

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

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

Une séquence de valeurs d'octets 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 ISO 8859-1 , â est représenté par un octet de valeur 226, alors qu'en UTF-8 il s'agit de deux octets: 195, 162. Cependant, dans ISO 8859-1 , 195, 162 serait composé de 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 octets 195, 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 donc les affiche ou les convertisse 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 octets et caractères.

1
rghome

À 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, l'unicode est un jeu de caractères utilisé dans des encodages comme UTF-8, UTF-16 et ainsi de suite. Voir l'illustration ici: See illustration here

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

1
Eric Liu