¿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?
¿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?
Respuestas:
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.
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 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:
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.
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.
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.
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.
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.
Los números dados son solo para almacenar 1 carácter
ASCII define 128 caracteres, ya que Unicode contiene un repertorio de más de 120,000 caracteres.
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 0x
para datos hexadecimales, una buena referencia básica es que el texto ASCII comienza con valores de bytes 0x00
para 0x7F
representar uno de los posibles valores de caracteres ASCII . El texto UTF normalmente se indica comenzando con los bytes 0xEF 0xBB 0xBF
para UTF8. Para UTF16, los bytes de inicio 0xFE 0xFF
, o 0xFF 0xFE
se 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.