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.
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).
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.
Comme prewett a souligné, cette règle ne s'applique qu'à UTF-8
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.
a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
????
????
Ok je m'emporte ...
Faits amusants:
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.
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.
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:
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
.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
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.
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.
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".