Je suis un peu confus au sujet des encodages. Autant que je sache, les anciens caractères ASCII prenaient un octet par caractère. De combien d'octets un caractère Unicode a-t-il besoin?
Je suppose qu'un caractère Unicode peut contenir tous les caractères possibles de n'importe quelle langue - ai-je raison? Alors, de combien d'octets a-t-il besoin par caractère?
Et que signifient UTF-7, UTF-6, UTF-16, etc.? S'agit-il de différentes versions d'Unicode?
J'ai lu l'article Wikipedia sur Unicode mais c'est assez difficile pour moi. J'ai hâte de voir une réponse simple.
Réponses:
Vous ne verrez pas de réponse simple car il n'y en a pas.
Tout d'abord, Unicode ne contient pas "tous les caractères de toutes les langues", bien qu'il essaie bien sûr.
Unicode lui-même est un mappage, il définit des points de code et un point de code est un nombre, généralement associé à un caractère. Je dis généralement parce qu'il existe des concepts comme la combinaison de personnages. Vous connaissez peut-être des choses comme les accents ou les trémas. Ceux-ci peuvent être utilisés avec un autre caractère, comme un
a
ou unu
pour créer un nouveau caractère logique. Un caractère peut donc consister en un ou plusieurs points de code.Pour être utile dans les systèmes informatiques, nous devons choisir une représentation pour ces informations. Ce sont les différents codages Unicode, tels que utf-8, utf-16le, utf-32 etc. Ils se distinguent largement par la taille de leurs unités de codage. UTF-32 est le codage le plus simple, il a une unité de codage de 32 bits, ce qui signifie qu'un point de code individuel s'intègre confortablement dans une unité de codage. Les autres encodages auront des situations où un point de code aura besoin de plusieurs unités de codage, ou ce point de code particulier ne peut pas du tout être représenté dans l'encodage (c'est un problème par exemple avec UCS-2).
En raison de la flexibilité de la combinaison de caractères, même dans un codage donné, le nombre d'octets par caractère peut varier en fonction du caractère et de la forme de normalisation. Il s'agit d'un protocole pour traiter les caractères qui ont plus d'une représentation (vous pouvez dire
"an 'a' with an accent"
qui est 2 points de code, dont l'un est un caractère de combinaison ou"accented 'a'"
qui est un point de code).la source
Curieusement, personne n'a indiqué comment calculer le nombre d'octets prenant un caractère Unicode. Voici la règle pour les chaînes codées UTF-8:
Donc, la réponse rapide est: cela prend 1 à 4 octets, selon le premier qui indiquera combien d'octets cela prendra.
la source
Je sais que cette question est ancienne et a déjà une réponse acceptée, mais je veux offrir quelques exemples (en espérant que cela sera utile à quelqu'un).
Droite. En fait, comme ASCII est un codage 7 bits, il prend en charge 128 codes (dont 95 sont imprimables), il n'utilise donc qu'un demi-octet (si cela a du sens).
Unicode mappe simplement les caractères aux points de code. Il ne définit pas comment les coder. Un fichier texte ne contient pas de caractères Unicode, mais des octets / octets qui peuvent représenter des caractères Unicode.
Non, mais presque. Donc, fondamentalement, oui. Mais toujours non.
Identique à votre 2e question.
Non, ce sont des encodages. Ils définissent comment les octets / octets doivent représenter les caractères Unicode.
Quelques exemples. Si certains d'entre eux ne peuvent pas être affichés dans votre navigateur (probablement parce que la police ne les prend pas en charge), accédez à
http://codepoints.net/U+1F6AA
(remplacer1F6AA
par le point de code en hexadécimal) pour voir une image.a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
💩
🚀
D'accord, je m'emballe ...
Faits amusants:
la source
00A9
place de00 A9
(qui serait UTF-16BE).Pour parler simplement
Unicode
est une norme qui attribue un numéro (appelé point de code) à tous les personnages du monde (son travail est toujours en cours).Maintenant, vous devez représenter ces points de code en utilisant des octets, c'est ce qu'on appelle
character encoding
.UTF-8, UTF-16, UTF-6
sont des moyens de représenter ces personnages.UTF-8
est un codage de caractères multi-octets. Les caractères peuvent avoir de 1 à 6 octets (certains d'entre eux ne sont peut-être pas nécessaires pour le moment).UTF-32
chaque caractère a 4 octets par caractère.UTF-16
utilise 16 bits pour chaque caractère et il ne représente qu'une partie des caractères Unicode appelés BMP (à toutes fins pratiques, cela suffit). Java utilise cet encodage dans ses chaînes.la source
En UTF-8:
En UTF-16:
En UTF-32:
10FFFF est le dernier point de code unicode par définition, et il est défini de cette façon parce que c'est la limite technique de l'UTF-16.
C'est également le plus grand point de code UTF-8 peut coder en 4 octets, mais l'idée derrière le codage UTF-8 fonctionne également pour les codages 5 et 6 octets pour couvrir les points de code jusqu'à 7FFFFFFF, c'est-à-dire. la moitié de ce que l'UTF-32 peut.
la source
En Unicode, la réponse n'est pas facile à donner. Le problème, comme vous l'avez déjà souligné, concerne les encodages.
Étant donné toute phrase en anglais sans caractères diacritiques, la réponse pour UTF-8 serait autant d'octets que de caractères et pour UTF-16, ce serait le nombre de caractères multiplié par deux.
Le seul encodage où (à partir de maintenant) nous pouvons faire la déclaration sur la taille est UTF-32. Là, c'est toujours 32 bits par caractère, même si j'imagine que des points de code sont préparés pour un futur UTF-64 :)
Ce qui le rend si difficile, ce sont au moins deux choses:
U+20AC
peut être représenté soit sous forme de trois octets séquenceE2 82 AC
ou quatre octets séquenceF0 82 82 AC
.la source
Il existe un excellent outil pour calculer les octets de n'importe quelle chaîne en UTF-8: http://mothereff.in/byte-counter
Mise à jour: @mathias a rendu le code public: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
la source
Eh bien, je viens de tirer la page Wikipedia dessus, et dans la partie d'introduction, j'ai vu "Unicode peut être implémenté par différents encodages de caractères. Les encodages les plus couramment utilisés sont UTF-8 (qui utilise un octet pour tous les caractères ASCII, qui ont les mêmes valeurs de code dans le codage UTF-8 et ASCII, et jusqu'à quatre octets pour les autres caractères), le désormais obsolète UCS-2 (qui utilise deux octets pour chaque caractère mais ne peut pas coder tous les caractères dans la norme Unicode actuelle) "
Comme le montre cette citation, votre problème est que vous supposez qu'Unicode est un moyen unique de coder les caractères. Il existe en fait plusieurs formes d'Unicode, et, encore une fois dans cette citation, l'une d'entre elles a même 1 octet par caractère, tout comme ce à quoi vous êtes habitué.
Donc, votre réponse simple que vous voulez est que cela varie.
la source
Pour UTF-16, le caractère a besoin de quatre octets (deux unités de code) s'il commence par 0xD800 ou plus; un tel personnage est appelé «paire de substitution». Plus précisément, une paire de substitution a la forme:
où [...] indique une unité de code à deux octets avec la plage donnée. Tout <= 0xD7FF est une unité de code (deux octets). N'importe quoi> = 0xE000 n'est pas valide (sauf les marqueurs de nomenclature, sans doute).
Voir http://unicodebook.readthedocs.io/unicode_encodings.html , section 7.5.
la source
Découvrez ce convertisseur de code Unicode . Par exemple, entrez
0x2009
, où 2009 est le numéro Unicode pour l'espace fin , dans le champ "notation 0x ...", puis cliquez sur Convertir. Le nombre hexadécimalE2 80 89
(3 octets) apparaît dans le champ "UTF-8 code units".la source
De Wiki:
Ce sont les trois encodages différents les plus populaires.
la source
Unicode
est une norme qui fournit un numéro unique pour chaque personnage. Ces numéros uniques sont appeléscode point
s (qui est juste un code unique) pour tous les caractères existant dans le monde (certains doivent encore être ajoutés).À différentes fins, vous devrez peut-être le représenter
code points
en octets (la plupart des langages de programmation le font), et voici oùCharacter Encoding
intervient.UTF-8
,UTF-16
,UTF-32
Et ainsi de suite sont tousCharacter Encodings
, et les points de code Unicode sont représentés dans ces codages, de différentes façons.UTF-8
le codage a une longueur à largeur variable et les caractères qui y sont codés peuvent occuper de 1 à 4 octets inclus;UTF-16
a une longueur variable et les caractères codés peuvent prendre 1 ou 2 octets (soit 8 ou 16 bits). Cela ne représente qu'une partie de tous les caractères Unicode appelés BMP (Basic Multilingual Plane) et c'est suffisant pour presque tous les cas. Java utilise l'UTF-16
encodage pour ses chaînes et caractères;UTF-32
a une longueur fixe et chaque caractère prend exactement 4 octets (32 bits).la source