Quel est le nombre maximum d'octets pour un caractère encodé UTF-8?

Quel est le nombre maximum d'octets pour un seul caractère encodé UTF-8?

je vais chiffrer les octets d'une chaîne encodée en UTF-8 et j'ai donc besoin de pouvoir calculer le nombre maximum d'octets pour une chaîne encodée en UTF-8.

est-ce que quelqu'un pourrait confirmer le nombre maximum d'octets pour un seul caractère encodé UTF-8 s'il vous plaît

58
demandé sur Edd 2012-03-02 16:26:12

2 réponses

le nombre maximum d'octets par caractère est de 4 selon RFC3629 qui a limité la table de caractères à U+10FFFF :

en UTF-8, caractères U+0000..U+10FFFF (la gamme UTF-16 accessible range) sont codés à l'aide de séquences de 1 à 4 octets.

(la spécification originale permettait jusqu'à six codes de caractères octets pour les points de code au-delà de U+10FFFF .)

Les caractères

dont le code est inférieur à 128 n'auront besoin que d'un octet, et les codes de caractères de 1920 n'auront besoin que de 2 octets. À moins que vous ne travailliez avec un langage ésotérique, la multiplication du nombre de caractères par 4 sera une surestimation significative.

64
répondu Tamás 2012-03-02 12:40:51

sans contexte supplémentaire, je dirais que le nombre maximum d'octets pour un caractère dans UTF-8 est

réponse: 6 octets

l'auteur de la réponse acceptée A correctement souligné ceci comme la "spécification d'origine", mais je pense que cela induit en erreur le lecteur, parce que pour autant que je sache, c'est toujours la spécification actuelle et correcte, par wikipedia , et par un livre de Google sur UTF-8 en Java .

la RFC référencée dans la réponse acceptée indique que seulement quatre octets sont pertinents pour un encodage UTF-16, de sorte que ce n'est correct que si nous ajoutons le contexte

réponse si traduisant seulement les caractères de UTF-16 à UTF-8: 4 octets

maintenant, est-ce que tous les caractères qui peuvent être représentés par UTF-16 sont utiles? Selon wikipedia à nouveau , unicode peut représenter jusqu'à x10ff des points de code. Donc, y compris 0, cela signifie que nous pouvons le faire avec ces octets: FF FF, c'est-à-dire deux octets et demi, ou 20 bits. En regardant en arrière à la spécification UTF-8, nous voyons que nous pouvons représenter 20 bits avec jusqu'à quatre octets encodés UTF-8. So

réponse si le recouvrement de tous les caractères unicode: 4 octets

, Mais dans Java <= v7 , on parle de 3 octets maximum pour la représentation unicode en UTF-8? C'est parce que la spécification originale unicode a seulement défini la base plan multilingue ( BMP ), c'est-à-dire une ancienne version d'unicode, ou sous-ensemble d'unicode moderne. So

réponse si représentant seulement l'unicode original, le BMP: 3 octets

mais, L'OP parle d'aller dans l'autre sens. Pas des caractères aux octets UTF-8, mais des octets UTF-8 à une "chaîne" de représentation d'octets. Peut-être l'auteur de la accepté de répondre obtenu à partir du contexte de la question, mais ce n'est pas nécessairement évident, donc peut embrouiller le lecteur occasionnel de cette question.

en passant de L'UTF-8 à l'encodage natif, nous devons regarder comment la" chaîne " est implémentée. Certains langages, comme Python >= 3 représenteront chaque caractère avec des points de code entiers, ce qui permet de 4 octets par caractère = 32 bits pour couvrir les 20 dont nous avons besoin pour unicode, avec un certain gaspillage. Pourquoi pas exactement 20 cents? Parce que les choses sont plus rapides quand elles sont alignées par octets. Certains langages comme Python <= 2 et Java représentent des caractères utilisant un encodage UTF-16, ce qui signifie qu'ils doivent utiliser des paires de substitution pour représenter unicode étendu (pas BMP). Dans les deux cas, c'est 4 octets maximum.

réponse si vous allez UTF-8 -> encodage natif: 4 octets

donc, conclusion finale, 4 est la bonne réponse la plus courante, donc nous l'avons bien fait. Mais, dans certains contextes, vous devez être prudent. Par exemple, ne vous attendez pas à ce que vous puissiez représenter tout ce que vous lire à partir D'un flux UTF-8 dans un maximum de 4 octets. Si ce n'est pas unicode, vous pouvez avoir besoin de jusqu'à 6 octets.

24
répondu Joshua Richardson 2016-01-27 01:16:56