Quelle est la différence exacte entre Unicode et ASCII?
ASCII a un total de 128 caractères (256 dans l'ensemble étendu).
Existe-t-il une spécification de taille pour les caractères Unicode?
Quelle est la différence exacte entre Unicode et ASCII?
ASCII a un total de 128 caractères (256 dans l'ensemble étendu).
Existe-t-il une spécification de taille pour les caractères Unicode?
Réponses:
ASCII définit 128 caractères, qui correspondent aux nombres 0–127. Unicode définit (moins de) 2 21 caractères, qui, de la même manière, correspondent aux numéros 0–2 21 (bien que tous les numéros ne soient pas actuellement attribués et certains soient réservés).
Unicode est un sur-ensemble d'ASCII, et les nombres 0–127 ont la même signification en ASCII qu'en Unicode. Par exemple, le nombre 65 signifie «capitale latine« A »».
Étant donné que les caractères Unicode ne tiennent généralement pas dans un octet 8 bits, il existe de nombreuses façons de stocker des caractères Unicode dans des séquences d'octets, telles que UTF-32 et UTF-8.
Comprendre pourquoi ASCII et Unicode ont été créés en premier lieu m'a aidé à comprendre les différences entre les deux.
ASCII, Origines
Comme indiqué dans les autres réponses, ASCII utilise 7 bits pour représenter un caractère. En utilisant 7 bits, nous pouvons avoir un maximum de 2 ^ 7 (= 128) combinaisons distinctes * . Ce qui signifie que nous pouvons représenter 128 caractères maximum.
Attendez, 7 bits? Mais pourquoi pas 1 octet (8 bits)?
Le dernier bit (8ème) est utilisé pour éviter les erreurs comme bit de parité . C'était pertinent il y a des années.
La plupart des caractères ASCII sont des caractères imprimables de l'alphabet tels que abc, ABC, 123,? & !, etc. Les autres sont des caractères de contrôle tels que le retour chariot, le saut de ligne , la tabulation, etc.
Voir ci-dessous la représentation binaire de quelques caractères en ASCII:
0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)
Voir le tableau ASCII complet ici .
ASCII était destiné à l'anglais uniquement.
Quelle? Pourquoi l'anglais seulement? Tant de langues là-bas!
Parce que le centre de l'industrie informatique était aux USA à cette époque. En conséquence, ils n'avaient pas besoin de prendre en charge les accents ou autres marques telles que á, ü, ç, ñ, etc. (aka diacritiques ).
ASCII étendu
Certaines personnes intelligentes ont commencé à utiliser le 8ème bit (le bit utilisé pour la parité) pour encoder plus de caractères pour supporter leur langue (pour supporter "é", en français par exemple). L'utilisation d'un seul bit supplémentaire a doublé la taille de la table ASCII d'origine pour mapper jusqu'à 256 caractères (2 ^ 8 = 256 caractères). Et pas 2 ^ 7 comme avant (128).
10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)
Le nom de cet "ASCII étendu à 8 bits et non pas 7 bits comme avant" pourrait simplement être appelé "ASCII étendu" ou "ASCII 8 bits".
Comme @Tom l'a souligné dans son commentaire ci-dessous, il n'y a pas de " ASCII étendu ", mais c'est un moyen facile de se référer à cette astuce du 8ème bit. Il existe de nombreuses variantes de la table ASCII 8 bits, par exemple l' ISO 8859-1, également appelée ISO Latin-1 .
Unicode, The Rise
ASCII Extended résout le problème des langues basées sur l'alphabet latin ... qu'en est-il des autres qui ont besoin d'un alphabet complètement différent? Grec? Russe? Chinois et autres?
Nous aurions eu besoin d'un tout nouveau jeu de caractères ... c'est la raison d'être d'Unicode. Unicode ne contient pas tous les caractères de toutes les langues, mais il contient certainement une quantité gigantesque de caractères ( voir ce tableau ).
Vous ne pouvez pas enregistrer de texte sur votre disque dur en tant que "Unicode". Unicode est une représentation abstraite du texte. Vous devez "encoder" cette représentation abstraite. C'est là qu'un encodage entre en jeu.
Encodages: UTF-8 vs UTF-16 vs UTF-32
Cette réponse fait un très bon travail pour expliquer les bases:
UTF-8 utilise le jeu ASCII pour les 128 premiers caractères. C'est pratique car cela signifie que le texte ASCII est également valide en UTF-8.
Mnémotechnique:
Remarque:
Pourquoi 2 ^ 7?
C'est évident pour certains, mais juste au cas où. Nous avons sept emplacements disponibles remplis de 0 ou 1 ( code binaire ). Chacun peut avoir deux combinaisons. Si nous avons sept spots, nous avons 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 combinaisons. Considérez cela comme une serrure à combinaison à sept roues, chaque roue ayant seulement deux chiffres.
Source: Wikipedia , ce grand article de blog et Mocki où j'ai initialement publié ce résumé.
ASCII a 128 points de code, de 0 à 127. Il peut tenir dans un seul octet de 8 bits, les valeurs 128 à 255 étant généralement utilisées pour d'autres caractères. Avec des choix incompatibles, provoquant la catastrophe de la page de codes . Le texte encodé dans une page de codes ne peut pas être lu correctement par un programme qui suppose ou devine une autre page de codes.
Unicode est sur le point de résoudre ce désastre. La version 1 a commencé avec 65536 points de code, généralement codés en 16 bits. Plus tard étendu dans la version 2 à 1,1 million de points de code. La version actuelle est 6.3, utilisant 110.187 des 1.1 millions de points de code disponibles. Cela ne tient plus en 16 bits.
L'encodage en 16 bits était courant lorsque la v2 est apparue, utilisée par exemple par les systèmes d'exploitation Microsoft et Apple. Et des exécutions de langage comme Java. La spécification v2 a trouvé un moyen de mapper ces 1,1 million de points de code en 16 bits. Un codage appelé UTF-16, un codage de longueur variable où un point de code peut prendre 2 ou 4 octets. Les points de code v1 d'origine prennent 2 octets, ceux ajoutés en prennent 4.
Un autre codage de longueur variable très courant, utilisé dans les systèmes d'exploitation et les outils * nix est UTF-8, un point de code peut prendre entre 1 et 4 octets, les codes ASCII d'origine prennent 1 octet, le reste en prend plus. Le seul codage de longueur non variable est UTF-32, prend 4 octets pour un point de code. Pas souvent utilisé car il est assez gaspilleur. Il y en a d'autres, comme UTF-1 et UTF-7, largement ignorés.
Un problème avec les encodages UTF-16/32 est que l'ordre des octets dépendra de l'endian-ness de la machine qui a créé le flux de texte. Ajoutez donc au mélange UTF-16BE, UTF-16LE, UTF-32BE et UTF-32LE.
Le fait d'avoir ces différents choix d'encodage ramène le désastre de la page de codes dans une certaine mesure, ainsi que des débats animés parmi les programmeurs, le choix UTF étant le "meilleur". Leur association avec les valeurs par défaut du système d'exploitation trace à peu près les lignes. Une contre-mesure est la définition d'une nomenclature, la marque d'ordre des octets, un point de code spécial (U + FEFF, espace de largeur nulle) au début d'un flux de texte qui indique comment le reste du flux est codé. Il indique à la fois le codage UTF et l'endianess et est neutre pour un moteur de rendu de texte. Malheureusement, il est facultatif et de nombreux programmeurs revendiquent leur droit de l'omettre, de sorte que les accidents sont encore assez courants.
java prend en charge Unicode, c'est-à-dire qu'il prend en charge tous les alphabets du monde. Par conséquent, la taille de char en java est de 2 octets. Et la plage va de 0 à 65535.
ASCII a 128 positions de code, attribuées aux caractères graphiques et aux caractères de contrôle (codes de contrôle).
Unicode a 1 114 112 positions de code. Actuellement, environ 100 000 d'entre eux ont été attribués à des caractères, et de nombreux points de code sont devenus définitivement non-caractères (c'est-à-dire qu'ils ne sont jamais utilisés pour encoder un caractère), et la plupart des points de code ne sont pas encore attribués.
Les seules choses que ASCII et Unicode ont en commun sont: 1) Ce sont des codes de caractères. 2) Les 128 premières positions de code d'Unicode ont été définies pour avoir les mêmes significations qu'en ASCII, sauf que les positions de code des caractères de contrôle ASCII sont juste définies comme désignant des caractères de contrôle, avec des noms correspondant à leurs noms ASCII, mais leurs significations sont non défini en Unicode.
Parfois, cependant, Unicode est caractérisé (même dans la norme Unicode!) Comme «Wide ASCII». Il s'agit d'un slogan qui essaie principalement de transmettre l'idée qu'Unicode est censé être un code de caractère universel de la même manière qu'ASCII autrefois (bien que le répertoire de caractères d'ASCII était désespérément insuffisant pour une utilisation universelle), contrairement à l'utilisation de codes différents dans différents systèmes et applications et pour différentes langues.
Unicode en tant que tel ne définit que la «taille logique» des caractères: chaque caractère a un numéro de code dans une plage spécifique. Ces numéros de code peuvent être présentés à l'aide de différents codages de transfert, et en interne, en mémoire, les caractères Unicode sont généralement représentés en utilisant une ou deux quantités de 16 bits par caractère, selon la plage de caractères, en utilisant parfois une quantité de 32 bits par caractère.
ASCII et Unicode sont deux encodages de caractères. Fondamentalement, ce sont des normes sur la façon de représenter les différents caractères en binaire afin qu'ils puissent être écrits, stockés, transmis et lus sur des supports numériques. La principale différence entre les deux réside dans la façon dont ils codent le caractère et le nombre de bits qu'ils utilisent pour chacun. ASCII utilisait à l'origine sept bits pour coder chaque caractère. Il a ensuite été porté à huit avec ASCII étendu pour remédier à l'insuffisance apparente de l'original. En revanche, Unicode utilise un programme d'encodage à bits variables où vous pouvez choisir entre les encodages 32, 16 et 8 bits. L'utilisation de plus de bits vous permet d'utiliser plus de caractères au détriment de fichiers plus volumineux tandis que moins de bits vous donne un choix limité mais vous économisez beaucoup d'espace. Utiliser moins de bits (c.-à-d.
L'une des principales raisons pour lesquelles Unicode était le problème provenait des nombreux programmes ASCII étendus non standard. À moins que vous n'utilisiez la page courante, utilisée par Microsoft et la plupart des autres éditeurs de logiciels, vous risquez de rencontrer des problèmes avec vos personnages apparaissant sous forme de cases. Unicode élimine pratiquement ce problème car tous les points de code de caractères ont été standardisés.
Un autre avantage majeur d'Unicode est qu'à son maximum, il peut accueillir un grand nombre de caractères. Pour cette raison, Unicode contient actuellement la plupart des langues écrites et a encore de la place pour encore plus. Cela inclut des scripts typiques de gauche à droite comme l'anglais et même des scripts de droite à gauche comme l'arabe. Le chinois, le japonais et les nombreuses autres variantes sont également représentés dans Unicode. Unicode ne sera donc pas remplacé de si tôt.
Afin de maintenir la compatibilité avec l'ancien ASCII, qui était déjà largement utilisé à l'époque, Unicode a été conçu de telle sorte que les huit premiers bits correspondent à celui de la page ASCII la plus populaire. Donc, si vous ouvrez un fichier encodé ASCII avec Unicode, vous obtenez toujours les caractères corrects encodés dans le fichier. Cela a facilité l'adoption d'Unicode car elle a réduit l'impact de l'adoption d'une nouvelle norme de codage pour ceux qui utilisaient déjà ASCII.
Sommaire:
1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.
Les nombres donnés sont uniquement pour stocker 1 caractère
ASCII définit 128 caractères, car Unicode contient un répertoire de plus de 120 000 caractères.
Au-delà de la façon dont UTF est un sur-ensemble d'ASCII, une autre bonne différence à savoir entre ASCII et UTF est en termes d'encodage de fichiers sur disque et de représentation et de stockage des données dans la mémoire aléatoire. Les programmes savent que les données données doivent être comprises comme une chaîne ASCII ou UTF, soit en détectant des codes de marque d'ordre d'octets spéciaux au début des données, soit en supposant de l'intention du programmeur que les données sont du texte, puis en vérifiant les modèles qui les indiquent. dans un codage de texte ou un autre.
En utilisant la notation de préfixe conventionnelle 0x
pour les données hexadécimales, une bonne référence de base est que le texte ASCII commence par des valeurs d'octet 0x00
pour 0x7F
représenter l'une des valeurs de caractères ASCII possibles . Le texte UTF est normalement indiqué en commençant par les octets 0xEF 0xBB 0xBF
pour UTF8. Pour UTF16, les octets de démarrage 0xFE 0xFF
, ou 0xFF 0xFE
sont utilisés, avec l'ordre de fin des octets de texte indiqué par l'ordre des octets de démarrage. La simple présence de valeurs d'octets qui ne sont pas dans la plage ASCII des valeurs d'octets possibles indique également que les données sont probablement UTF.
Il existe d'autres marques d'ordre d'octets qui utilisent des codes différents pour indiquer que les données doivent être interprétées comme du texte codé dans une certaine norme de codage.