web-dev-qa-db-fra.com

Combien d'octets un caractère Unicode prend-il?

Je suis un peu confus au sujet des encodages. Autant que je sache, les anciens caractères ASCII prenaient un octet par caractère. Combien d'octets un caractère Unicode nécessite-t-il?

Je suppose qu'un caractère Unicode peut contenir tous les caractères possibles de toutes les langues - est-ce exact? Alors, combien d'octets faut-il par caractère?

Et que signifient UTF-7, UTF-6, UTF-16, etc.? Existe-t-il différentes versions de Unicode?

J'ai lu le article Wikipedia sur Unicode mais c'est assez difficile pour moi. Je suis impatient de voir une réponse simple.

216
nan

Vous ne verrez pas une réponse simple car il n'y en a pas.

Premièrement, Unicode ne contient pas "tous les caractères de toutes les langues", bien qu'il essaye certainement.

Unicode lui-même est un mappage, il définit des points de code et un point de code est un nombre associé à généralement un caractère. Je dis habituellement parce qu'il existe des concepts tels que la combinaison de caractères. Vous connaissez peut-être des choses comme les accents ou les trémas. Ceux-ci peuvent être utilisés avec un autre caractère, tel qu'un a ou un u pour créer un nouveau caractère logique. Un caractère peut donc consister en un ou plusieurs points de code.

Pour être utiles 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 codecs. UTF-32 est le codage le plus simple, il a un codeunit de 32 bits, ce qui signifie qu’un point de code individuel s’intègre facilement dans un codeunit. Les autres codages auront des situations dans lesquelles un point de code aura besoin de plusieurs unités de code, ou ce point de code particulier ne pourra absolument pas être représenté dans le codage (c'est un problème par exemple avec UCS-2).

En raison de la souplesse de combinaison des 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. C'est 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).

132
Logan Capaldo

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:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF4   First byte of a 4-byte character encoding

La réponse rapide est donc la suivante: cela prend 1 à 4 octets, selon le premier qui indiquera combien d'octets cela va prendre.

Mise à jour

Comme prewett a souligné, cette règle ne s'applique qu'à UTF-8

175
paul.ago

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).

Autant que je sache, les anciens caractères ASCII prenaient un octet par caractère.

Droite. En fait, comme ASCII est un codage sur 7 bits, il prend en charge 128 codes (dont 95 sont imprimables), de sorte qu’il n’utilise qu’un demi-octet (si cela a un sens).

Combien d'octets un caractère Unicode nécessite-t-il?

Unicode mappe simplement les caractères en points de code. Cela ne définit pas comment les encoder. Un fichier texte ne contient pas de caractères Unicode, mais des octets/octets pouvant représenter des caractères Unicode.

Je suppose qu'un caractère Unicode peut contenir tous les caractères possibles de toutes les langues - est-ce exact?

Non mais presque. Donc, fondamentalement, oui. Mais toujours non.

Alors, combien d'octets faut-il par caractère?

Identique à votre 2ème question.

Et que signifient UTF-7, UTF-6, UTF-16, etc.? S'agit-il de versions Unicode?

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 (remplacez 1F6AA par le code codé en hexadécimal) pour afficher une image.

    • U + 0061 LETTRE MINUSCULE LATINE A: a
      • Nº: 97
      • UTF-8: 61
      • UTF-16: 00 61
    • U + 00A9 PLAQUE COPYRIGHT: ©
      • Nº: 169
      • UTF-8: C2 A9
      • UTF-16: 00 A9
    • U + 00AE SIGNE ENREGISTRÉ: ®
      • Nº: 174
      • UTF-8: C2 AE
      • UTF-16: 00 AE
    • U + 1337 PHWA SYLLABLE ETHIOPIQUE:
      • Nº: 4919
      • UTF-8: E1 8C B7
      • UTF-16: 13 37
    • U + 2014 EM DASH:
      • Nº: 8212
      • UTF-8: E2 80 94
      • UTF-16: 20 14
    • U + 2030 SIGNE PAR MILLE:
      • Nº: 8240
      • UTF-8: E2 80 B0
      • UTF-16: 20 30
    • Signe EUR U + 20AC:
      • Nº: 8364
      • UTF-8: E2 82 AC
      • UTF-16: 20 AC
    • U + 2122 SIGNE DE MARQUE:
      • Nº: 8482
      • UTF-8: E2 84 A2
      • UTF-16: 21 22
    • U + 2603 SNOWMAN:
      • Nº: 9731
      • UTF-8: E2 98 83
      • UTF-16: 26 03
    • U + 260E TELEPHONE NOIR:
      • Nº: 9742
      • UTF-8: E2 98 8E
      • UTF-16: 26 0E
    • U + 2614 PARAPLUIE AVEC GOUTTES DE PLUIE:
      • Nº: 9748
      • UTF-8: E2 98 94
      • UTF-16: 26 14
    • U + 263A VISAGE BLANC BLANC:
      • Nº: 9786
      • UTF-8: E2 98 BA
      • UTF-16: 26 3A
    • U + 2691 DRAPEAU NOIR:
      • Nº: 9873
      • UTF-8: E2 9A 91
      • UTF-16: 26 91
    • U + 269B ATOM SYMBOLE:
      • Nº: 9883
      • UTF-8: E2 9A 9B
      • UTF-16: 26 9B
    • U + 2708 AVION:
      • Nº: 9992
      • UTF-8: E2 9C 88
      • UTF-16: 27 08
    • U + 271E CROIX LATINE BLANCHE:
      • Nº: 10014
      • UTF-8: E2 9C 9E
      • UTF-16: 27 1E
    • U + 3020 FACE POSTALE:
      • Nº: 12320
      • UTF-8: E3 80 A0
      • UTF-16: 30 20
    • U + 8089 CJK IDÉOGRAPHIE UNIFIÉE-8089:
      • Nº: 32905
      • UTF-8: E8 82 89
      • UTF-16: 80 89
    • U + 1F4A9 PILE DE POO: ????
      • Nº: 128169
      • UTF-8: F0 9F 92 A9
      • UTF-16: D8 3D DC A9
    • U + 1F680 ROCKET: ????
      • Nº: 128640
      • UTF-8: F0 9F 9A 80
      • UTF-16: D8 3D DE 80

Ok je m'emporte ...

Faits amusants:

36
basic6

Tout 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).

Vous devez maintenant représenter ces points de code en utilisant des octets, appelés character encoding. UTF-8, UTF-16, UTF-6 sont des moyens de représenter ces caractères.

UTF-8 est un codage multi-octets. Les caractères peuvent avoir de 1 à 6 octets (certains d'entre eux ne sont peut-être pas nécessaires pour l'instant).

UTF-32 chaque caractère a 4 octets par caractères.

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 utiles, il suffit). Java utilise cet encodage dans ses chaînes.

28
Zimbabao

En UTF-8:

1 byte:       0 -     7F     (ASCII)
2 bytes:     80 -    7FF     (all European plus some Middle Eastern)
3 bytes:    800 -   FFFF     (multilingual plane incl. the top 1792 and private-use)
4 bytes:  10000 - 10FFFF

En UTF-16:

2 bytes:      0 -   D7FF     (multilingual plane except the top 1792 and private-use )
4 bytes:   D800 - 10FFFF

En UTF-32:

4 bytes:      0 - 10FFFF

10FFFF est le dernier point de code unicode par définition, et il est défini ainsi car il s'agit de la limite technique de l'UTF-16.

C'est également le plus grand point de code que UTF-8 puisse coder sur 4 octets, mais l'idée derrière le codage de UTF-8 fonctionne également pour les codages de 5 et 6 octets afin de couvrir les points de code jusqu'à 7FFFFFFF, c'est-à-dire. la moitié de ce que UTF-32 peut.

13
John

En Unicode, la réponse n’est pas facile. Comme vous l'avez déjà souligné, le problème réside dans les encodages.

Quelle que soit la phrase anglaise ne comportant pas de caractères diacritiques, la réponse pour UTF-8 serait autant d'octets que de caractères et pour UTF-16, le nombre de caractères multiplié par deux.

Le seul encodage où (pour le moment) nous pouvons faire la déclaration à propos de la taille est UTF-32. C'est toujours 32 bits par caractère, même si j'imagine que les points de code sont préparés pour un futur UTF-64 :)

Ce qui le rend si difficile, ce sont au moins deux choses:

  1. caractères composés, où, au lieu d'utiliser l'entité de caractère déjà accentuée/diacritique (À), un utilisateur a décidé de combiner l'accent et le caractère de base (`A).
  2. points de code. Les points de code sont la méthode par laquelle les codages UTF permettent de coder plus que le nombre de bits qui leur donne normalement leur nom. Par exemple. UTF-8 désigne certains octets qui, à eux seuls, ne sont pas valides, mais lorsqu'ils sont suivis d'un octet de continuation valide, ils permettent de décrire un caractère au-delà de la plage de 8 bits de 0..255. Voir les Exemples et Overlong Encodings ci-dessous dans l'article de Wikipedia sur UTF-8.
    • L’excellent exemple cité ici est que le caractère € (point de code U+20AC] peut être représenté sous la forme de trois octets séquence E2 82 AC ou séquence sur quatre octets F0 82 82 AC.
    • Les deux sont valides, et cela montre à quel point la réponse est compliquée quand on parle d '"Unicode" et non d'un codage Unicode spécifique, tel que UTF-8 ou UTF-16.
8
0xC0000022L

Il existe un excellent outil pour calculer les octets de toute 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

7
Nic Cottrell

Eh bien, je viens juste d’afficher la page Wikipedia, 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 tout ASCII caractères, qui ont les mêmes valeurs de code dans les codages UTF-8 et ASCII, et jusqu’à quatre octets pour les autres caractères), l’UCS-2, devenu obsolète (qui utilise deux octets pour chaque caractère). mais ne peut pas encoder tous les caractères du standard Unicode actuel) "

Comme le montre cette citation, votre problème est que vous supposez qu'Unicode est un moyen unique d'encoder des caractères. Il existe en réalité plusieurs formes d'Unicode et, encore une fois dans cette citation, l'une d'entre elles possède même 1 octet par caractère, exactement comme vous le savez déjà.

Donc, votre réponse simple que vous voulez, c'est que cela varie.

4
Loduwijk

Pour UTF-16, le caractère nécessite quatre octets (deux unités de code) s'il commence par 0xD800 ou plus; un tel personnage est appelé "paire de substitution". Plus spécifiquement, une paire de substitution a la forme:

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

où [...] indique une unité de code à deux octets avec la plage donnée. Quelque chose <= 0xD7FF correspond à une unité de code (deux octets). Quelque chose> = 0xE000 n'est pas valide (sauf les marqueurs de nomenclature, sans doute).

Voir http://unicodebook.readthedocs.io/unicode_encodings.html , section 7.5.

3
prewett

Découvrez ceci convertisseur de code Unicode . Par exemple, entrez 0x2009, où 2009 est le numéro Unicode pour l'espace réduit , dans le champ "Notation 0x ...", puis cliquez sur Convertir. Le nombre hexadécimal E2 80 89 (3 octets) apparaît dans le champ "Unités de code UTF-8".

1
ma11hew28