¿Cuál es la diferencia entre ASCII y Unicode?

407

¿Cuál es la diferencia exacta entre Unicode y ASCII?

ASCII tiene un total de 128 caracteres (256 en el conjunto extendido).

¿Existe alguna especificación de tamaño para los caracteres Unicode?

Ashvitha
fuente

Respuestas:

534

ASCII define 128 caracteres, que se asignan a los números 0–127. Unicode define (menos de) 2 21 caracteres, que, de manera similar, se asignan a los números 0–2 21 (aunque no todos los números están asignados actualmente, y algunos están reservados).

Unicode es un superconjunto de ASCII, y los números 0–127 tienen el mismo significado en ASCII que en Unicode. Por ejemplo, el número 65 significa "capital latina 'A'".

Debido a que los caracteres Unicode generalmente no caben en un byte de 8 bits, existen numerosas formas de almacenar caracteres Unicode en secuencias de bytes, como UTF-32 y UTF-8.

Kerrek SB
fuente
44
@riderBill: ¿Y ahora qué? ¿De qué 3 bits estás hablando? No hay bits en Unicode. Solo puntos de código.
Kerrek SB
@riderBill: de nuevo: ¿de qué "3 bytes" estás hablando ahora? :-) (Nada de esto tiene que ver con Unicode. Unicode solo se trata de asignar significado a los números, no se trata de bits y bytes).
Kerrek SB
8
@riderBill: Unicode no "usa entre 1 y 4 bytes". Unicode es una asignación de significado a los números. No usa ningún byte. Existen ciertos esquemas de codificación estandarizados para representar puntos de código Unicode como una secuencia de bytes, pero son ortogonales a Unicode como un conjunto de caracteres. (Sí, siéntase libre de eliminar lo que desee).
Kerrek SB
@CleanCrispCode Unicode es en realidad un superconjunto de ISO-8859-1 , que en sí mismo es un superconjunto de ASCII. A veces es útil saberlo.
Mark Ransom
8
Para aclarar, Unicode conjunto de caracteres en sí es un superconjunto de ISO-8859-1 conjunto de caracteres , pero UTF-8 codificación es no un superconjunto de ISO-8859-1 codificación pero ASCII codificación .
minmaxavg
393

Comprender por qué ASCII y Unicode se crearon en primer lugar me ayudó a comprender las diferencias entre los dos.

ASCII, Orígenes

Como se indicó en las otras respuestas, ASCII usa 7 bits para representar un carácter. Al usar 7 bits, podemos tener un máximo de 2 ^ 7 (= 128) combinaciones distintas * . Lo que significa que podemos representar 128 caracteres como máximo.

Espera, ¿7 bits? Pero, ¿por qué no 1 byte (8 bits)?

El último bit (octavo) se usa para evitar errores como bit de paridad . Esto fue relevante hace años.

La mayoría de los caracteres ASCII son caracteres imprimibles del alfabeto, como abc, ABC, 123,? & !, etc. Los otros son caracteres de control , como retorno de carro, avance de línea , tabulación, etc.

Vea a continuación la representación binaria de algunos caracteres 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)

Vea la tabla ASCII completa aquí .

ASCII fue solo para inglés.

¿Qué? ¿Por qué solo inglés? ¡Tantos idiomas por ahí!

Porque el centro de la industria informática estaba en los Estados Unidos en ese momento. Como consecuencia, no necesitaban admitir acentos u otras marcas como á, ü, ç, ñ, etc. (también conocidos como diacríticos ).

ASCII extendido

Algunas personas inteligentes comenzaron a usar el octavo bit (el bit utilizado para la paridad) para codificar más caracteres para admitir su idioma (para admitir "é", en francés, por ejemplo). Simplemente usando un bit extra duplicó el tamaño de la tabla ASCII original para mapear hasta 256 caracteres (2 ^ 8 = 256 caracteres). Y no 2 ^ 7 como antes (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

El nombre de este "ASCII extendido a 8 bits y no a 7 bits como antes" podría referirse simplemente como "ASCII extendido" o "ASCII de 8 bits".

Como señaló @Tom en su comentario a continuación, no existe el " ASCII extendido ", pero esta es una manera fácil de referirse a este truco de 8 bits. Hay muchas variaciones de la tabla ASCII de 8 bits, por ejemplo, la ISO 8859-1, también llamada ISO Latin-1 .

Unicode, The Rise

ASCII Extended resuelve el problema para los idiomas que se basan en el alfabeto latino ... ¿qué pasa con los otros que necesitan un alfabeto completamente diferente? ¿Griego? ¿Ruso? Chino y los gustos?

Hubiéramos necesitado un conjunto de caracteres completamente nuevo ... eso es lo racional detrás de Unicode. Unicode no contiene todos los caracteres de cada idioma, pero sí contiene una cantidad gigantesca de caracteres ( consulte esta tabla ).

No puede guardar texto en su disco duro como "Unicode". Unicode es una representación abstracta del texto. Necesita "codificar" esta representación abstracta. Ahí es donde entra en juego una codificación .

Codificaciones: UTF-8 vs UTF-16 vs UTF-32

Esta respuesta hace un trabajo bastante bueno al explicar los conceptos básicos:

  • UTF-8 y UTF-16 son codificaciones de longitud variable.
  • En UTF-8, un personaje puede ocupar un mínimo de 8 bits.
  • En UTF-16, una longitud de caracteres comienza con 16 bits.
  • UTF-32 es una codificación de longitud fija de 32 bits.

UTF-8 usa el conjunto ASCII para los primeros 128 caracteres. Eso es útil porque significa que el texto ASCII también es válido en UTF-8.

Mnemotécnica:

  • UTF- 8 : mínimo 8 bits.
  • UTF- 16 : mínimo 16 bits.
  • UTF- 32 : mínimo y máximo 32 bits.

Nota:

¿Por qué 2 ^ 7?

Esto es obvio para algunos, pero por si acaso. Tenemos siete espacios disponibles con 0 o 1 ( código binario ). Cada uno puede tener dos combinaciones. Si tenemos siete puntos, tenemos 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 combinaciones. Piense en esto como una cerradura de combinación con siete ruedas, cada rueda tiene solo dos números.

Fuente: Wikipedia , esta gran publicación de blog y Mocki donde inicialmente publiqué este resumen.

Andrés
fuente
77
No hay texto sino texto codificado. Algunas codificaciones son muy sencillas, particularmente para conjuntos de caracteres con <= 256 puntos de código. "ASCII extendido" es un término muy ambiguo; hay algunos que admiten griego, ruso y / o polaco. ASCII es insuficiente para el texto en inglés, que usa á, ü, ç, ñ. Sospecho que fue diseñado para admitir lenguajes de computadora en lugar de lenguajes humanos. Dogmáticamente, cuando escribe un archivo o secuencia, tiene un conjunto de caracteres y elige una codificación. Su lector tiene que obtener los bytes y el conocimiento de qué codificación. De lo contrario, la comunicación ha fallado.
Tom Blodget
Muchas gracias por la adición. Actualicé la respuesta en consecuencia.
Andrew
Gracias. Noto que en todas partes las tablas ASCII muestran códigos de caracteres como 0-127, pero las tablas UTF-8 muestran los códigos como hexadecimales y no como enteros. ¿Hay alguna razón para esto? ¿Por qué las tablas UTF-X no muestran 0-127 / 255/65535 versus 00-AF? ¿Esto significa algo?
wayofthefuture
Gracias por tu respuesta. Pregunta rápida: 'En UTF-16, una longitud de caracteres comienza con 16 bits'. ¿Significa esto que los caracteres alfanuméricos no pueden ser representados por UTF-16 ya que son solo caracteres de 8 bits?
Moondra
Gran respuesta, solo que tengo un problema: ¿el polaco realmente usa un alfabeto diferente? Pensé que usamos el mismo que el inglés, ¿solo con algunas letras adicionales?
Nicofisi
89

ASCII tiene 128 puntos de código, de 0 a 127. Puede caber en un solo byte de 8 bits, los valores de 128 a 255 tienden a usarse para otros caracteres. Con opciones incompatibles, provocando un desastre en la página de códigos . El texto codificado en una página de códigos no puede ser leído correctamente por un programa que asume o adivine en otra página de códigos.

Unicode surgió para resolver este desastre. La versión 1 comenzó con 65536 puntos de código, comúnmente codificados en 16 bits. Más tarde se extendió en la versión 2 a 1.1 millones de puntos de código. La versión actual es 6.3, usando 110,187 de los 1.1 millones de puntos de código disponibles. Eso ya no cabe en 16 bits.

La codificación en 16 bits era común cuando apareció la v2, utilizada por ejemplo por los sistemas operativos Microsoft y Apple. Y tiempos de ejecución del lenguaje como Java. La especificación v2 surgió con una forma de mapear esos 1.1 millones de puntos de código en 16 bits. Una codificación llamada UTF-16, una codificación de longitud variable donde un punto de código puede tomar 2 o 4 bytes. Los puntos del código v1 original toman 2 bytes, los agregados toman 4.

Otra codificación de longitud variable que es muy común, utilizada en los sistemas operativos y herramientas * nix es UTF-8, un punto de código puede tomar entre 1 y 4 bytes, los códigos ASCII originales toman 1 byte, el resto toma más. La única codificación de longitud no variable es UTF-32, toma 4 bytes para un punto de código. No se usa con frecuencia ya que es bastante derrochador. Hay otros, como UTF-1 y UTF-7, ampliamente ignorados.

Un problema con las codificaciones UTF-16/32 es que el orden de los bytes dependerá de la capacidad de la máquina que creó la secuencia de texto. Entonces agregue a la mezcla UTF-16BE, UTF-16LE, UTF-32BE y UTF-32LE.

Tener estas diferentes opciones de codificación devuelve el desastre de la página de códigos hasta cierto punto, junto con acalorados debates entre los programadores sobre cuál es la mejor opción para UTF. Su asociación con los valores predeterminados del sistema operativo casi dibuja las líneas. Una contramedida es la definición de una lista de materiales, la marca de orden de bytes, un punto de código especial (U + FEFF, espacio de ancho cero) al comienzo de una secuencia de texto que indica cómo se codifica el resto de la secuencia. Indica tanto la codificación UTF como la resistencia y es neutral para un motor de representación de texto. Desafortunadamente es opcional y muchos programadores reclaman su derecho a omitirlo, por lo que los accidentes siguen siendo bastante comunes.

Hans Passant
fuente
31

Java proporciona soporte para Unicode, es decir, es compatible con todos los alfabetos de todo el mundo. Por lo tanto, el tamaño de char en java es de 2 bytes. Y el rango es de 0 a 65535.

ingrese la descripción de la imagen aquí

Siddarth Kanted
fuente
Imagen clave para explicar
Ponmari Subramanian
2
Lástima que esté mal. "Códigos ASCII (128)" sería correcto.
Mark Tolonen
15

ASCII tiene 128 posiciones de código, asignadas a caracteres gráficos y caracteres de control (códigos de control).

Unicode tiene 1,114,112 posiciones de código. Alrededor de 100,000 de ellos se han asignado actualmente a caracteres, y muchos puntos de código se han convertido permanentemente en caracteres (es decir, no se utilizan para codificar ningún carácter), y la mayoría de los puntos de código aún no se han asignado.

Las únicas cosas que ASCII y Unicode tienen en común son: 1) Son códigos de caracteres. 2) Las 128 primeras posiciones de código de Unicode se han definido para que tengan los mismos significados que en ASCII, excepto que las posiciones de código de los caracteres de control ASCII se definen como denotando caracteres de control, con nombres correspondientes a sus nombres ASCII, pero sus significados son no definido en Unicode.

A veces, sin embargo, Unicode se caracteriza (¡incluso en el estándar Unicode!) Como "ASCII amplio". Este es un eslogan que trata principalmente de transmitir la idea de que Unicode está destinado a ser un código de caracteres universal de la misma manera que lo fue ASCII (aunque el repertorio de caracteres de ASCII era irremediablemente insuficiente para el uso universal), en oposición a usar diferentes códigos en diferentes sistemas y aplicaciones y para diferentes idiomas.

Unicode como tal define solo el "tamaño lógico" de los caracteres: cada carácter tiene un número de código en un rango específico. Estos números de código se pueden presentar usando diferentes codificaciones de transferencia, y internamente, en la memoria, los caracteres Unicode generalmente se representan usando una o dos cantidades de 16 bits por carácter, dependiendo del rango de caracteres, a veces usando una cantidad de 32 bits por carácter.

Jukka K. Korpela
fuente
2
Creo que la codificación más común para Unicode es UTF-8 en estos días. UTF-8 codifica la mayoría de los puntos de código en 1, 2 o 3 bytes.
Binarus
14

ASCII y Unicode son codificaciones de dos caracteres. Básicamente, son estándares sobre cómo representar caracteres de diferencia en binario para que puedan escribirse, almacenarse, transmitirse y leerse en medios digitales. La principal diferencia entre los dos está en la forma en que codifican el carácter y la cantidad de bits que usan para cada uno. Originalmente, ASCII usaba siete bits para codificar cada carácter. Posteriormente, esto se aumentó a ocho con ASCII extendido para abordar la aparente insuficiencia del original. Por el contrario, Unicode utiliza un programa de codificación de bits variable donde puede elegir entre codificaciones de 32, 16 y 8 bits. El uso de más bits le permite usar más caracteres a expensas de archivos más grandes, mientras que menos bits le dan una opción limitada, pero ahorra mucho espacio. Usando menos bits (es decir

Una de las principales razones por las cuales Unicode fue el problema surgió de los muchos programas ASCII extendidos no estándar. A menos que esté utilizando la página predominante, que es utilizada por Microsoft y la mayoría de las otras compañías de software, es probable que encuentre problemas con los caracteres que aparecen como cuadros. Unicode prácticamente elimina este problema ya que todos los puntos de código de caracteres fueron estandarizados.

Otra ventaja importante de Unicode es que, como máximo, puede acomodar una gran cantidad de caracteres. Debido a esto, Unicode actualmente contiene la mayoría de los idiomas escritos y aún tiene espacio para aún más. Esto incluye guiones típicos de izquierda a derecha como el inglés e incluso guiones de derecha a izquierda como el árabe. Chino, japonés y muchas otras variantes también están representados dentro de Unicode. Entonces, Unicode no será reemplazado pronto.

Para mantener la compatibilidad con el ASCII anterior, que ya estaba en uso generalizado en ese momento, Unicode fue diseñado de tal manera que los primeros ocho bits coincidían con los de la página ASCII más popular. Entonces, si abre un archivo codificado ASCII con Unicode, aún obtendrá los caracteres correctos codificados en el archivo. Esto facilitó la adopción de Unicode, ya que disminuyó el impacto de adoptar un nuevo estándar de codificación para aquellos que ya usaban ASCII.

Resumen:

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.

Tomado de: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs

Nikhil Katre
fuente
1

Almacenamiento

Los números dados son solo para almacenar 1 carácter

  • ASCII ⟶ 2 7 bits ( 1 byte )
  • ASCII extendido ⟶ 2 8 bits (1 byte)
  • UTF-8 ⟶ mínimo 2 8 , máximo 2 32 bits (mínimo 1, máximo 4 bytes)
  • UTF-16 ⟶ mínimo 2 16 , máximo 2 32 bits (mínimo 2, máximo 4 bytes)
  • UTF-32 ⟶ 2 32 bits (4 bytes)

Uso (a partir de febrero de 2020)

Porcentajes de sitios web que utilizan varias codificaciones de caracteres

Hasan Sefa Ozalp
fuente
0

ASCII define 128 caracteres, ya que Unicode contiene un repertorio de más de 120,000 caracteres.

sphynx888
fuente
44
-1 para esta "respuesta" duplicada trivial que no agrega nada a las respuestas anteriores mucho anteriores. Por favor, no agregue el desorden duplicado de esta manera (obtenga representante de otras maneras que sean legítimas)
cellepo
-1

Más allá de cómo UTF es un superconjunto de ASCII, otra buena diferencia para saber entre ASCII y UTF es en términos de codificación de archivos de disco y representación y almacenamiento de datos en memoria aleatoria. Los programas saben que los datos dados deben entenderse como una cadena ASCII o UTF, ya sea mediante la detección de códigos especiales de marca de orden de bytes al comienzo de los datos, o asumiendo, por la intención del programador, que los datos son texto y luego verifican los patrones que indican que son en una codificación de texto u otra.

Usando la notación de prefijo convencional 0xpara datos hexadecimales, una buena referencia básica es que el texto ASCII comienza con valores de bytes 0x00para 0x7Frepresentar uno de los posibles valores de caracteres ASCII . El texto UTF normalmente se indica comenzando con los bytes 0xEF 0xBB 0xBFpara UTF8. Para UTF16, los bytes de inicio 0xFE 0xFF, o 0xFF 0xFEse usan, con el orden de endianidad de los bytes de texto indicado por el orden de los bytes de inicio. La simple presencia de valores de bytes que no están en el rango ASCII de posibles valores de bytes también indica que los datos son probablemente UTF.

Existen otras marcas de orden de bytes que utilizan diferentes códigos para indicar que los datos deben interpretarse como texto codificado en un determinado estándar de codificación.

stackuser83
fuente