web-dev-qa-db-fra.com

Qu'est-ce qu'un jeu de caractères multi-octets?

Le terme multi-octets fait-il référence à un jeu de caractères dont les caractères peuvent - mais ne doivent pas être - plus larges que 1 octet, (par exemple UTF-8) ou se réfère-t-il à des jeux de caractères qui sont en tout cas plus larges que 1 octet (par exemple UTF -16)? En d'autres termes: que signifie-t-on si quelqu'un parle de jeux de caractères multi-octets?

32
prinzdezibel

Le terme est ambigu, mais dans mon travail d'internationalisation, nous avons généralement évité le terme "jeux de caractères multi-octets" pour faire référence aux codages basés sur Unicode. Généralement, nous utilisons le terme uniquement pour les schémas de codage hérités qui avaient un ou plusieurs octets pour définir chaque caractère (à l'exception des codages qui ne nécessitent qu'un octet par caractère).

Shift-jis, jis, euc-jp, euc-kr, ainsi que les encodages chinois sont généralement inclus.

La plupart des encodages hérités, à quelques exceptions près, nécessitent une sorte de modèle de machine à états (ou, plus simplement, un modèle d'échange de pages) pour être traités, et revenir en arrière dans un flux de texte est compliqué et sujet aux erreurs. UTF-8 et UTF-16 ne souffrent pas de ce problème, car UTF-8 peut être testé avec un masque de bits et UTF-16 peut être testé par rapport à une gamme de paires de substitution, donc le déplacement vers l'arrière et vers l'avant dans un document non pathologique peut être fait en toute sécurité sans complexité majeure.

Quelques encodages hérités, pour des langues comme le thaï et le vietnamien, ont une partie de la complexité des jeux de caractères multi-octets mais sont vraiment construits uniquement sur la combinaison de caractères, et ne sont généralement pas regroupés avec le terme large "multi-octets".

31
JasonTrue

Que veut-on dire si quelqu'un parle de jeux de caractères multi-octets?

Cela, comme d'habitude, dépend de qui parle!

Logiquement, il devrait inclure UTF-8, Shift-JIS, GB etc.: les encodages de longueur variable. UTF-16 n'est souvent pas pris en compte dans ce groupe (même si c'est le cas, avec les substituts; et c'est certainement plusieurs octets lorsqu'il est codé en octets via UTF-16LE/UTF-16BE).

Mais dans Microsoftland, le terme serait plus généralement utilisé pour désigner une page de code système par défaut de longueur variable (pour les applications non-Unicode héritées, dont il y a malheureusement encore beaucoup). Dans cette utilisation, UTF-8 et UTF-16LE/UTF-16BE ne peuvent pas être inclus car la page de codes système sous Windows ne peut pas être définie sur l'un de ces encodages.

En effet, dans certains cas, "mbcs" n'est rien de plus qu'un synonyme de la page de codes du système, autrement connue (encore plus trompeuse) sous le nom de "ANSI". Dans ce cas, un jeu de caractères "multi-octets" pourrait en fait être aussi trivial que cp1252 Western European, qui n'utilise qu'un octet par caractère!

Mon conseil: utilisez "longueur variable" quand vous voulez dire cela, et évitez le terme ambigu "multioctet"; lorsque quelqu'un d'autre l'utilise, vous devrez demander des éclaircissements, mais généralement une personne ayant une expérience Windows parlera d'une page de code héritée d'Asie de l'Est comme cp932 (Shift-JIS) et non d'un UTF.

16
bobince

Tous les jeux de caractères pour lesquels vous n'avez pas de mappage 1 octet = 1 caractère. Toutes les variantes Unicode, mais aussi les jeux de caractères asiatiques sont multi-octets.

Pour plus d'informations, je suggère de lire cet article Wikipedia .

6
Lucero

Un caractère multi-octets signifie un caractère dont l'encodage nécessite plus d'un octet. Cela n'implique cependant pas que tous les caractères utilisant ce codage particulier auront la même largeur (en termes d'octets). Par exemple: les caractères codés UTF-8 et UTF-16 peuvent parfois utiliser plusieurs octets alors que tous les caractères codés UTF-32 toujours utilisez 32 bits.

Les références:

4
dirkgently

Typiquement le premier, c'est-à-dire de type UTF-8. Pour plus d'informations, voir Encodage à largeur variable .

2
Mihai Limbășan

Le premier - bien que le terme "codage de longueur variable" serait plus approprié.

2
Nemanja Trifunovic

Je l'utilise généralement pour faire référence à tout caractère qui peut avoir plus d'un octet par caractère.

2
Bert Lamb

Un jeu de caractères multi-octets peut être composé de caractères à un octet et à deux octets. Ainsi, une chaîne de caractères à plusieurs octets peut contenir un mélange de caractères à un octet et à deux octets.

Réf: jeux de caractères mono-octet et multi-octets

1
navigaid

UTF-8 est multi-octet, ce qui signifie que chaque caractère anglais (ASCII) est stocké dans 1 octet tandis que les caractères non anglais comme le chinois, le thaï, sont stockés dans 3 octets. Lorsque vous mélangez le chinois/thaï avec l'anglais, comme "ท t", le premier caractère thaï "ท" utilise 3 octets tandis que le deuxième caractère anglais "t" utilise seulement 1 octet. Les personnes qui ont conçu un codage multi-octets ont réalisé que le caractère anglais ne devrait pas être stocké sur 3 octets alors qu'il peut tenir dans 1 octet en raison du gaspillage d'espace de stockage.

UTF-16 stocke chaque caractère anglais ou non anglais dans une longueur fixe de 2 octets, il n'est donc pas multi-octet mais appelé caractère large. Il est très approprié pour les langues chinois/thaï où chaque caractère tient entièrement en 2 octets mais l'impression sur la sortie de la console utf-8 nécessite une conversion du caractère large au format multi-octets en utilisant la fonction wcstombs ().

UTF-32 stocke chaque caractère dans une longueur fixe de 4 octets mais personne ne l'utilise pour stocker le caractère en raison d'un gaspillage d'espace de stockage.

1
Ray Chakrit