Le code ASCII est-il 7 bits ou 8 bits?

101

Mon professeur m'a dit que l'ASCII était un schéma de codage de caractères 8 bits. Mais il n'est défini que pour les codes 0-127, ce qui signifie qu'il peut être ajusté sur 7 bits. Alors ne peut-on pas prétendre que le bit ASCII est en fait du code 7 bits?

Et que voulons-nous dire du tout en disant que l'ASCII est du tout du code à 8 bits?

Anurag Kalia
la source

Réponses:

93

ASCII a en effet été conçu à l'origine comme un code 7 bits. Cela a été fait bien avant que les octets 8 bits ne deviennent omniprésents, et même dans les années 1990, vous pouviez trouver un logiciel qui supposait qu'il pouvait utiliser le 8ème bit de chaque octet de texte à ses propres fins ("pas 8 bits propre"). De nos jours, les gens le considèrent comme un codage 8 bits dans lequel les octets 0x80 à 0xFF n'ont pas de signification définie, mais c'est un retcon .

Il existe des dizaines d'encodages de texte qui utilisent le 8ème bit; ils peuvent être classés comme compatibles ASCII ou non, et de largeur fixe ou variable. Compatible ASCII signifie que quel que soit le contexte , les octets simples avec des valeurs de 0x00 à 0x7F codent les mêmes caractères qu'ils le feraient en ASCII. Vous ne voulez rien avoir à voir avec un encodage de texte non compatible ASCII si vous pouvez l'éviter; Les programmes naïfs qui attendent l'ASCII ont tendance à les mal interpréter de manière catastrophique, souvent révolutionnaire. Ils sont tellement obsolètes de nos jours que (par exemple) HTML5 interdit leur utilisation sur le Web public, à l'exception malheureuse de UTF-16 . Je ne vais plus en parler.

Un encodage à largeur fixe signifie ce à quoi il ressemble: tous les caractères sont encodés en utilisant le même nombre d'octets. Pour être compatible ASCII, un encodage fixe doit encoder tous ses caractères en utilisant un seul octet, de sorte qu'il ne peut pas avoir plus de 256 caractères. Le codage le plus courant de nos jours est Windows-1252 , une extension de l' ISO 8859-1 .

Il n'y a qu'un seul encodage compatible ASCII à largeur variable à connaître de nos jours, mais il est très important: UTF-8 , qui intègre tout Unicode dans un encodage compatible ASCII. Vous voulez vraiment l'utiliser si vous pouvez le gérer.

En guise de note finale, "ASCII" prend aujourd'hui sa définition pratique d'Unicode, et non de sa norme d'origine (ANSI X3.4-1968), car il existait historiquement plusieurs dizaines de variations sur le répertoire de 127 caractères ASCII - par exemple, certaines la ponctuation pourrait être remplacée par des lettres accentuées pour faciliter la transmission du texte français. De nos jours, toutes ces variantes sont obsolètes, et quand les gens disent «ASCII», cela signifie que les octets avec la valeur 0x00 à 0x7F codent les points de code Unicode U + 0000 à U + 007F. Cela n'aura probablement d'importance pour vous que si vous vous retrouvez à rédiger une norme technique.

Si vous êtes intéressé par l'histoire de l'ASCII et les encodages qui l'ont précédé, commencez par l'article "L'évolution des codes de caractères, 1874-1968" (copie samizdat à http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf ) puis recherchez ses références (dont beaucoup ne sont pas disponibles en ligne et peuvent être difficiles à trouver même avec l'accès à une bibliothèque universitaire, je regrette de le dire).

zwol
la source
1
Alors, ASCII noawadays est-il 7 bits ou 8 bits? Vous dites qu'il utilise maintenant 0x00-0x7F, évidemment. Mais comptons-nous le premier 0?
Anurag Kalia le
8
Cela dépend du type de pédant que vous êtes. La spécification qui définit encore officiellement ASCII (ANSI X3.4-1968) le décrit comme un encodage 7 bits, mais personne ne transmet plus d'octets 7 bits, et l'interopérabilité de nos jours dicte que le huitième bit doit être zéro - vous ne pouvez pas utilisez-le pour un bit de parité ou similaire. Il est donc tout aussi valable IMNSHO de décrire ASCII comme un codage à huit bits qui laisse la moitié supérieure de son espace numérique comme "réservé, ne pas utiliser". Dans tous les cas, si vous transmettez des octets de huit bits dont l'un quelconque a son bit haut défini, vous ne transmettez pas d' ASCII valide.
zwol
1
(... mais vous pourriez transmettre quelque chose de valide-autre, comme UTF-8 ou ISO 8859-1 ou KOI8-R.)
zwol
1
Pour être vraiment pédant, le standard est maintenant INCITS 4-1986 [R2012] car ASC anciennement connu sous le nom de X3 a muté en NCITS puis INCITS. Mais les variantes 7 bits avec une douzaine de lettres accentuées pour le français, l'allemand, l'espagnol, etc. ne sont rien d'ANSI / INCITS, mais plutôt ISO / IEC 646 et ECMA-6. Et c'est 8 bits (ISO / CEI) 8859-1 qui forme le premier bloc de 256 caractères d'Unicode.
dave_thompson_085
2
@ dave_thompson_085 Tout le monde n'est pas aussi pédant que vous - ce qui signifie que vous pouvez trouver une documentation technique plus ancienne, et même des normes, qui font référence à "ASCII", voire à "X3.4-1968", dans l'intention d' inclure les variantes nationales, ou du moins ne l'excluant pas clairement, conduisant à des arguments. Par conséquent, j'utiliserais personnellement Unicode comme référence normative pour ASCII si je devais écrire une spécification là où cela importait. C'est tout ce que je voulais dire.
zwol
15

Sur Linux man asciidit:

ASCII est le code standard américain pour l'échange d'informations. C'est un code 7 bits.

BeniBela
la source
10

La table ASCII d'origine est codée sur 7 bits, elle comporte donc 128 caractères.

De nos jours, la plupart des lecteurs / éditeurs utilisent une table ASCII "étendue" (à partir de l' ISO 8859-1 ), qui est encodée sur 8 bits et jouit de 256 caractères (y compris Á , Ä , Œ , é , è et d'autres caractères utiles pour les langues européennes également sous forme de glyphes mathématiques et autres symboles).

Alors que UTF-8 utilise le même codage que la table ASCII de base (la signification 0x41est A dans les deux codes), il ne partage pas le même codage pour le bloc "Latin Extended-A". Ce qui fait parfois apparaître des caractères étranges dans des mots comme à la carte ou piñata .

Guillaume
la source
Il y a plusieurs erreurs dans ce qui précède. Œ ne fait pas partie de l'ISO 8859-1 bien qu'elle le soit dans CP-1252 . Et le bloc Latin Extended-A n'est pas les 128 ou 256 premiers caractères d'Unicode: c'est le bloc suivant après qu'ils contiennent des lettres comme ğ, ł et.
Richard Smith
Bon point! Je pense que je voulais dire "Supplément Latin-1". Standards standards ...
Guillaume
1
Il existe de nombreux jeux de caractères "ASCII étendus" et un seul d'entre eux est ISO 8859-1. Le terme n'a presque pas de sens car lorsque vous encodez et décodez du texte, vous devez savoir quel encodage de caractères spécifique est utilisé (et ce n'est peut-être même pas pour un jeu de caractères ASCII étendu).
Tom Blodget
2

Le codage ASCII est de 7 bits, mais en pratique, les caractères codés en ASCII ne sont pas stockés dans des groupes de 7 bits. Au lieu de cela, un ASCII est stocké dans un octet, avec le MSB généralement mis à 0 (oui, il est gaspillé en ASCII).

Vous pouvez vérifier cela en entrant une chaîne dans le jeu de caractères ASCII dans un éditeur de texte, en définissant le codage sur ASCII et en affichant le binaire / hexadécimal:
entrez la description de l'image ici

A part: l'utilisation du codage (strictement) ASCII est désormais rare, au profit de l'UTF-8 (qui ne gaspille pas le MSB mentionné ci-dessus - en fait, un MSB de 1 indique que le point de code est codé avec plus d'un octet).

flow2k
la source
0

Le code ASCII d'origine fournissait 128 caractères différents numérotés de 0 à 127. ASCII et 7 bits sont synonymes, puisque l'octet de 8 bits est l'élément de stockage commun, l'ASCII laisse de la place pour 128 caractères supplémentaires qui sont utilisés pour les langues étrangères et d'autres symboles. Mais le code 7 bits était original avant le code 8 bits. ASCII signifie code standard américain pour l'échange d'informations. Ces systèmes utilisent 8 bits de l'octet, mais il doit ensuite être transformé en un format 7 bits en utilisant des méthodes de codage telles que MIME, UUcoding et BinHex. Cela signifie que le 8 bits a été converti en caractères 7 bits, ce qui ajoute des octets supplémentaires pour les encoder.

Brookey
la source
-4

lorsque nous appelons ASCII comme code à 7 bits, le bit le plus à gauche est utilisé comme bit de signe, donc avec 7 bits, nous pouvons écrire jusqu'à 127. cela signifie de -126 à 127 car la valeur imam maximale de ASCII est de 0 à 255. cela peut être seulement satisfait de l'argument de 7 bits si le dernier bit est considéré comme un bit de signe

aju
la source
Comment un personnage peut-il avoir un signe?
Oleh Misarosh