¿El código ASCII es de 7 u 8 bits?

100

Mi profesor me dijo que ASCII es un esquema de codificación de caracteres de 8 bits. Pero está definido solo para códigos 0-127, lo que significa que se puede ajustar a 7 bits. Entonces, ¿no se puede argumentar que el bit ASCII es en realidad un código de 7 bits?

¿Y qué queremos decir cuando decimos que ASCII es un código de 8 bits?

Anurag Kalia
fuente

Respuestas:

91

De hecho, ASCII se concibió originalmente como un código de 7 bits. Esto se hizo mucho antes de que los bytes de 8 bits se volvieran ubicuos, e incluso en la década de 1990 se podía encontrar software que asumía que podía usar el octavo bit de cada byte de texto para sus propios fines ("no limpio de 8 bits"). Hoy en día, la gente lo ve como una codificación de 8 bits en la que los bytes 0x80 a 0xFF no tienen un significado definido, pero eso es un retcon .

Hay docenas de codificaciones de texto que utilizan el octavo bit; se pueden clasificar como compatibles con ASCII o no, y de ancho fijo o variable. Compatible con ASCII significa que, independientemente del contexto , los bytes individuales con valores de 0x00 a 0x7F codifican los mismos caracteres que lo harían en ASCII. No querrá tener nada que ver con una codificación de texto no compatible con ASCII si es posible que pueda evitarlo; Los programas ingenuos que esperan ASCII tienden a malinterpretarlos de una manera catastrófica, a menudo que rompe la seguridad. Están tan desaprobados hoy en día que (por ejemplo) HTML5 prohíbe su uso en la Web pública, con la desafortunada excepción de UTF-16 . No voy a hablar más de ellos.

Una codificación de ancho fijo significa lo que parece: todos los caracteres se codifican utilizando el mismo número de bytes. Para ser compatible con ASCII, una codificación con fijo debe codificar todos sus caracteres usando un solo byte, por lo que no puede tener más de 256 caracteres. La codificación más común hoy en día es Windows-1252 , una extensión de ISO 8859-1 .

Solo hay una codificación compatible con ASCII de ancho variable que vale la pena conocer hoy en día, pero es muy importante: UTF-8 , que empaqueta todo Unicode en una codificación compatible con ASCII. Realmente desea usar esto si puede administrarlo.

Como nota final, "ASCII" hoy en día toma su definición práctica de Unicode, no su estándar original (ANSI X3.4-1968), porque históricamente hubo varias docenas de variaciones en el repertorio de 127 caracteres ASCII - por ejemplo, algunos de la puntuación puede sustituirse por letras acentuadas para facilitar la transmisión del texto en francés. Hoy en día todas esas variaciones son obsoletas, y cuando la gente dice "ASCII" quiere decir que los bytes con valor 0x00 a 0x7F codifican puntos de código Unicode U + 0000 a U + 007F. Es probable que esto solo le importe si alguna vez se encuentra escribiendo un estándar técnico.

Si está interesado en la historia de ASCII y las codificaciones que lo precedieron, comience con el artículo "La evolución de los códigos de caracteres, 1874-1968" (copia de samizdat en http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf ) y luego buscar sus referencias (muchas de las cuales no están disponibles en línea y pueden ser difíciles de encontrar incluso con acceso a una biblioteca universitaria, lamento decirlo).

zwol
fuente
1
Entonces, ¿ASCII noawadays es de 7 u 8 bits? Dices que ahora usa 0x00-0x7F, obviamente. Pero, ¿contamos el 0 inicial?
Anurag Kalia
8
Eso depende del tipo de pedante que seas. La especificación que todavía define oficialmente ASCII (ANSI X3.4-1968) lo describe como una codificación de 7 bits, pero ya nadie transmite bytes de 7 bits, y la interoperabilidad hoy en día dicta que el octavo bit debe ser cero; no se puede utilícelo para un bit de paridad o similar. Por lo tanto, IMNSHO es igualmente válido para describir ASCII como una codificación de ocho bits que deja la mitad superior de su espacio numérico como "reservado, no usar". De cualquier manera, si transmite los bytes de ocho bits cualquiera de los cuales tienen su bit alto, que está no transmitiendo ASCII válidos.
zwol
1
(... pero es posible que esté transmitiendo algo válido, como UTF-8 o ISO 8859-1 o KOI8-R.)
zwol
1
Para ser realmente pedante, el estándar ahora es INCITS 4-1986 [R2012] porque ASC antes conocido como X3 se transformó en NCITS y luego en INCITS. Pero las variantes de 7 bits con alrededor de una docena de letras acentuadas para francés, alemán, español, etc. no son nada ANSI / INCITS, sino ISO / IEC 646 y ECMA-6. Y es de 8 bits (ISO / IEC) 8859-1 el que forma el primer bloque de 256 caracteres de Unicode.
dave_thompson_085
2
@ dave_thompson_085 No todo el mundo es tan pedante como usted, lo que significa que puede encontrar documentación técnica más antigua, e incluso estándares, que hagan referencia a "ASCII", o incluso a "X3.4-1968", con la intención de incluir las variantes nacionales, o al menos sin descartarlo claramente, dando lugar a discusiones. Por lo tanto, personalmente usaría Unicode como referencia normativa para ASCII si tuviera que escribir una especificación donde importara. Eso es todo lo que quise decir.
zwol
14

En Linux man asciidice:

ASCII es el código estándar estadounidense para el intercambio de información. Es un código de 7 bits.

BeniBela
fuente
9

La tabla ASCII original está codificada en 7 bits, por lo que tiene 128 caracteres.

Hoy en día, la mayoría de lectores / editores utilizan una tabla ASCII "extendida" (de ISO 8859-1 ), que está codificada en 8 bits y tiene 256 caracteres (incluidos Á , Ä , Œ , é , è y otros caracteres útiles para los idiomas europeos también como glifos matemáticos y otros símbolos).

Si bien UTF-8 usa la misma codificación que la tabla ASCII básica (el significado 0x41es A en ambos códigos), no comparte la misma codificación para el bloque "Latin Extended-A". Lo que a veces hace que aparezcan personajes extraños en palabras como a la carta o piñata .

Guillaume
fuente
Hay varios errores en lo anterior. Œ no es parte de ISO 8859-1 aunque sí está en CP-1252 . Y el bloque Latin Extended-A no son los primeros 128 o 256 caracteres de Unicode: es el siguiente bloque que contiene letras como ğ, ł y ſ.
Richard Smith
¡Buen punto! Creo que quise decir "Suplemento Latin-1". Estándares estándares ...
Guillaume
1
Hay muchos juegos de caracteres "ASCII extendido" y solo uno de ellos es ISO 8859-1. El término casi no tiene sentido porque cuando está codificando y decodificando texto, debe saber qué codificación de caracteres específica se está utilizando (y puede que ni siquiera sea para un conjunto de caracteres ASCII extendido).
Tom Blodget
2

La codificación ASCII es de 7 bits, pero en la práctica, los caracteres codificados en ASCII no se almacenan en grupos de 7 bits. En cambio, un ASCII se almacena en un byte, con el MSB generalmente establecido en 0 (sí, se desperdicia en ASCII).

Puede verificar esto ingresando una cadena en el juego de caracteres ASCII en un editor de texto, configurando la codificación en ASCII y viendo el binario / hexadecimal:
ingrese la descripción de la imagen aquí

Aparte: el uso de codificación (estrictamente) ASCII ahora es poco común, a favor de UTF-8 (que no desperdicia el MSB mencionado anteriormente; de ​​hecho, un MSB de 1 indica que el punto de código está codificado con más de 1 byte).

flow2k
fuente
0

El código ASCII original proporcionó 128 caracteres diferentes numerados del 0 al 127. ASCII a 7 bits son sinónimos, ya que el byte de 8 bits es el elemento de almacenamiento común, ASCII deja espacio para 128 caracteres adicionales que se utilizan para idiomas extranjeros y otros símbolos. Pero el código de 7 bits se hizo originalmente antes del código de 8 bits. ASCII son las siglas de American Standard Code for Information Interchange. En los primeros sistemas de correo de Internet, solo admitía códigos ASCII de 7 bits, esto se debía a que luego podía ejecutar programas y archivos multimedia en sistemas de succión. Estos sistemas usan 8 bits del byte, pero luego deben convertirse en un formato de 7 bits utilizando métodos de codificación como MIME, UUcoding y BinHex. Esto significa que los 8 bits se han convertido en caracteres de 7 bits, lo que agrega bytes adicionales para codificarlos.

brookey
fuente
-3

cuando llamamos a ASCII como código de 7 bits, el bit más a la izquierda se usa como bit de signo, por lo que con 7 bits podemos escribir hasta 127.Eso significa de -126 a 127 porque el valor máximo de imán de ASCII es de 0 a 255.Esto puede ser solo satisfecho con el argumento de 7 bits si el último bit se considera bit de signo

aju
fuente
¿Cómo puede un personaje tener un signo?
Oleh Misarosh