web-dev-qa-db-fra.com

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

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

Je vais chiffrer les octets d'une chaîne codée en UTF-8 et je dois donc être en mesure de déterminer le nombre maximal d'octets pour une chaîne codée UTF-8.

Quelqu'un pourrait-il confirmer le nombre maximal d'octets pour un seul caractère codé UTF-8 s'il vous plaît

72
Edd

Le nombre maximal d'octets par caractère est de 4 selon RFC3629 qui limitait la table de caractères à U+10FFFF:

En UTF-8, les caractères de la plage U + 0000..U + 10FFFF (la plage accessible UTF-16) sont codés en utilisant des séquences de 1 à 4 octets.

(La spécification d'origine autorisait jusqu'à six octets de caractères pour les points de code au-delà de U+10FFFF.)

Les caractères avec un code inférieur à 128 nécessiteront 1 octet uniquement, et les codes de 1920 caractères suivants ne nécessitent que 2 octets. À moins que vous ne travailliez avec une langue ésotérique, multiplier le nombre de caractères par 4 sera une surestimation significative.

78
Tamás

Sans autre contexte, je dirais que le nombre maximal d'octets pour un caractère en UTF-8 est

réponse: 6 octets

L'auteur de la réponse acceptée a correctement indiqué qu'il s'agissait de la "spécification d'origine". C'était valide via RFC-2279 1 . Comme J. Cocoe l'a souligné dans les commentaires ci-dessous, cela a changé en 2003 avec RFC-3629 2 , ce qui limite UTF-8 au codage sur 21 bits, qui peut être géré avec le schéma de codage en utilisant quatre octets. .

réponse si couvrant tous les Unicode: 4 octets

Mais, en Java <= v7 , ils parlent d'un maximum de 3 octets pour représenter unicode avec UTF-8? En effet, la spécification Unicode d'origine ne définissait que le plan multilingue de base ( BMP ), c'est-à-dire qu'il s'agit d'une ancienne version d'Unicode ou d'un sous-ensemble d'Unicode moderne. Alors

répondre si représentant uniquement unicode d'origine, le BMP: 3 octets

Mais, le PO 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. L'auteur de la réponse acceptée a peut-être tiré cela du contexte de la question, mais ce n'est pas nécessairement évident, ce qui peut dérouter le lecteur occasionnel de cette question.

En passant de l'UTF-8 à l'encodage natif, nous devons voir comment la "chaîne" est implémentée. Certaines langues, comme Python> = 3 représentera chaque caractère avec des points de code entiers, ce qui autorise 4 octets par caractère = 32 bits pour couvrir les 21 dont nous avons besoin pour l'unicode, avec un certain gaspillage. Pourquoi pas exactement 21 bits? Parce que les choses sont plus rapides quand elles sont alignées sur des 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 toujours 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 avons bien compris. Mais, le kilométrage peut varier.

30
Joshua Richardson