web-dev-qa-db-fra.com

Que signifie 256 pour 128 caractères uniques dans une table ascii

Si je dois vérifier qu'une chaîne a des caractères uniques, je comprends si nous considérons des caractères dans la table Ascii, il y en aura 128.

Cependant, pourquoi avons-nous besoin de créer un tableau booléen de taille 256 pour contenir 128 caractères afin de vérifier si l'élément existait au moins une fois dans une chaîne? Un tableau booléen de taille 128 ne devrait-il pas suffire?

Voici une citation du livre "Cracking the Coding Interview":

if (str.length() > 128) return false;
boolean[] char_set = new boolean[256]; //which is strange since it clearly says over 128 its false

.....

35
Lydia

Fondamentalement, nous n'utilisons que 128 caractères au total, qui sont principalement utilisés pendant le programme. Mais le nombre total de caractères dans ASCII est de 256 (0 à 255). 0 à 31 (32 au total) est appelé ASCII caractères de contrôle (caractère code 0-31). Les caractères 32 à 127 sont appelés ASCII caractères imprimables (code des caractères 32-127). Les caractères 128 à 255 sont appelés caractères étendus ASCII = codes (code de caractère 128-255).

vérifier la référence: http://www.ascii-code.com/

La plupart des caractères étendus ASCII) ne sont pas présents dans le clavier QWERTY (ANGLAIS))], raison pour laquelle l'auteur a pris 128 caractères au total dans cet exemple. dans le livre "Cracking the coding interview".

20
MOHIT M SHARMA

Non, il y a 256 ASCII caractères. Cela inclut les caractères ASCII standard (0-127) et les caractères étendus ASCII (128-255).

Pour plus d'informations. Veuillez vous référer à: http://www.flexcomm.com/library/ASCII256.htm

14

De nos jours, de nombreuses personnes utilisent le terme " ASCII " pour décrire ISO-8859-1 (également appelé Latin-1) , un jeu de caractères contenant les valeurs de caractère imprimable [32 .. 126] de l'ancien ASCII) ainsi que des valeurs comprises entre [128..255]. Latin-1 couvre assez bien les langues d’Europe occidentale, alors que ASCII est limité aux caractères non accentués utilisés dans l’anglais de base.

ASCII inclut également des caractères de contrôle compris dans la plage [0-31] et 127. Ils ne représentent pas des caractères imprimables (bien que l'unicode fournisse des caractères à ces positions). Ils sont return, linefeed, tab, ctrl-c, formfeed, etc. Certains d'entre eux sont des vestiges de l'ancien système de télétype et de télex.

Teletype with 8-channel paper tape punch and reader

Notez que la bande de papier a huit positions de bits dans chaque image. Ce sont les bits de ASCII/Latin-1. "Supprimer" aussi appelé Rubout est 127 ou 0111 1111. Pourquoi? Car il était possible de percer les sept trous de la bande et de supprimer ainsi un caractère.

Cela peut expliquer la suggestion faite par quelqu'un d'utiliser un tableau à 256 positions pour tabuler du texte dans ce type de jeu de caractères.

8
O. Jones

Je pense que l'utilisation de 128 et 256 dans la même fonction est une erreur dans l'édition de ce livre. Dans la 6ème édition la plus récente (2016), l'exemple de code indique:

if (str.length() > 128) return false;
boolean[] char_set = new boolean[128];

et l'auteur ajoute le commentaire:

Il est correct d'assumer 256 caractères. Ce serait le cas en ASCII étendu.

Donc, utilisez soit 128 o 256, pas les deux, pour cet exercice.

2
Gunnar Karlsson

L'auteur a probablement confondu les caractères et les octets. Vous devez également comprendre le concept associé d’encodage.

Un octet est huit bits. Un octet était traditionnellement souvent utilisé pour stocker un caractère, bien que très tôt, les ordinateurs n’avaient besoin que de 7 bits pour stocker un caractère. Le norme ASCII pour le codage des caractères sur 7 bits a été ratifié en 1963, même si à l’époque il existait également des codages de caractères concurrents (dont EBCDIC survit encore à ce jour).

Lorsque vous n'utilisez que 7 des 8 bits disponibles, vous pouvez avoir des idées sur l'utilisation du bit de réserve. Une des méthodes courantes consistait à coder des caractères non standard supplémentaires qui n'étaient pas disponibles dans la norme ASCII). Un grand nombre de codages traditionnels à 8 bits ont été définis, dont certains ont été publiés. Certains sont encore populaires, par exemple ISO-8859-1 (alias Latin-1) et les pages de code Windows ( 437 , - 85 , et 1252 sont encore utilisés couramment dans les pays occidentaux, en dépit de leurs nombreux inconvénients. La plupart d’entre eux sont des codages "ASCII étendus" compatibles avec ASCII dans les 128 premiers octets, bien que le terme "ASCII étendu" ne soit pas vraiment bien défini techniquement.

Si vous traitez une séquence d'octets, vous souhaitez pouvoir gérer les valeurs d'octet comprises entre 0 et 255, et pas uniquement celles définies en ASCII. D'autre part, si vous avez la garantie qu'aucun des octets que vous allez traiter n'aura une valeur supérieure à 127 (par exemple, si votre entrée est connue comme étant ASCII car elle provient d’une source incapable de produire autre chose), il est excessif de réserver de la place à des valeurs dont vous savez que vous n’aurez plus besoin.

À l'avenir, la plupart des systèmes modernes utilisent Unicode sous une forme ou une autre. Sous Windows, et apparemment toujours en Java, vous devez vous attendre à TF-16 ; ailleurs, TF-8 devient rapidement le standard de facto . Dans les deux cas, votre code doit pouvoir gérer correctement les octets de 8 bits, bien que les points de code ne soient pas (nécessairement, en UTF-8 ou jamais en UTF-16) codés dans un seul octet.

En ce qui concerne le code que vous avez posté, vous avez raison de dire que 128 positions de caractères suffisent si vous supprimez tout octet dont la valeur est supérieure à 127. D'autre part, selon les données que vous comptez traiter, la suppression de caractères non-ASCII peut ne pas tout soit la bonne chose à faire; et ensuite, si vous ne jetez rien, vous devez gérer tous les 256.

Quoi qu'il en soit, si vous ne supprimez que les valeurs supérieures à 128, vous avez besoin de 129 positions dans le tableau (il existe 129 nombres entiers compris entre 0 et 128). C'est probablement juste un bogue idiot par-un.

1
tripleee