¿Cuál es la diferencia entre texto ASCII y Unicode?
ASCII y Unicode son ambos estándares que se refieren a la representación digital de texto, específicamente a los caracteres que componen el texto. Sin embargo, los dos estándares son significativamente diferentes, con muchas propiedades que reflejan su respectivo orden de creación.
América contra el universo
El Código Estándar Americano para el Intercambio de Información (ASCII), como era de esperar, está dirigido a una audiencia estadounidense, escribiendo en el alfabeto inglés. Se trata de letras sin acento, como AZ y az, además de una pequeña cantidad de símbolos de puntuación y caracteres de control.
En particular, no hay forma de representar palabras prestadas adoptadas de otros idiomas, como café, en ASCII, sin anglicizarlas sustituyéndolas por caracteres acentuados (por ejemplo, café ). Las extensiones ASCII localizadas se desarrollaron para satisfacer las necesidades de varios idiomas, pero estos esfuerzos hicieron que la interoperabilidad fuera incómoda y claramente ampliaban las capacidades de ASCII.
Por el contrario, el conjunto de caracteres codificados universal (Unicode) se encuentra en el extremo opuesto de la escala de ambición. Unicode intenta atender a la mayor cantidad posible de sistemas de escritura del mundo, en la medida en que cubre idiomas antiguos y el conjunto favorito de símbolos expresivos de todos, emoji.
¿Juego de caracteres o codificación de caracteres?
En términos simples, un juego de caracteres es una selección de caracteres (por ejemplo, AZ) mientras que una codificación de caracteres es una correspondencia entre un juego de caracteres y un valor que puede representarse digitalmente (por ejemplo, A = 1, B = 2).
El estándar ASCII es efectivamente ambos: define el conjunto de caracteres que representa y un método para asignar cada carácter a un valor numérico.
Por el contrario, la palabra Unicode se usa en varios contextos diferentes para significar cosas diferentes. Puede pensar en él como un término que lo abarca todo, como ASCII, para referirse a un conjunto de caracteres y una serie de codificaciones. Pero, debido a que hay varias codificaciones, el término Unicode se usa a menudo para referirse al conjunto general de caracteres, en lugar de cómo se asignan.
Talla
Debido a su alcance, Unicode representa muchos más caracteres que ASCII. ASCII estándar utiliza un rango de 7 bits para codificar 128 caracteres distintos. Unicode, por otro lado, es tan grande que necesitamos usar terminología diferente solo para hablar de ello.
Unicode atiende a 1,111,998 puntos de código direccionables . Un punto de código es más o menos análogo a un espacio reservado para un personaje, ¡pero la situación es mucho más complicada que eso cuando empiezas a profundizar en los detalles!
Una comparación más útil es cuántos scripts (o sistemas de escritura) se admiten actualmente. Por supuesto, ASCII solo maneja el alfabeto inglés, esencialmente el alfabeto latino o romano. La versión de Unicode producida en 2020 va mucho más allá: incluye soporte para un total de 154 scripts.
Almacenamiento
El rango de 7 bits de ASCII significa que cada carácter se almacena en un solo byte de 8 bits; el bit de repuesto no se utiliza en ASCII estándar. Esto hace que los cálculos de tamaño sean triviales: la longitud del texto, en caracteres, es el tamaño del archivo en bytes.
Puede confirmar esto con la siguiente secuencia de comandos de bash. Primero, creamos un archivo que contiene 12 letras de texto:
$ echo -n 'Hello, world' > foo
Para comprobar que el texto está en codificación ASCII, podemos usar el comando file :
$ file foo
foo: ASCII text, with no line terminators
Finalmente, para obtener el número exacto de bytes que ocupa el archivo, usamos el comando stat :
$ stat -f%z foo
12
Dado que el estándar Unicode se ocupa de una gama mucho mayor de caracteres, un archivo Unicode naturalmente ocupa más espacio de almacenamiento. Exactamente cuánto depende de la codificación.
Al repetir el mismo conjunto de comandos de antes, utilizando un carácter que no se puede representar en ASCII, se obtiene lo siguiente:
$ echo -n '€' > foo
$ file foo
foo: UTF-8 Unicode text, with no line terminators
$ stat -f%z foo
3
Ese único carácter ocupa 3 bytes en un archivo Unicode. Tenga en cuenta que bash creó automáticamente un archivo UTF-8 ya que un archivo ASCII no puede almacenar el carácter elegido (€). UTF-8 es, con mucho, la codificación de caracteres más común para Unicode; UTF-16 y UTF-32 son dos codificaciones alternativas, pero se utilizan mucho menos.
UTF-8 es una codificación de ancho variable, lo que significa que usa diferentes cantidades de almacenamiento para diferentes puntos de código. Cada punto de código ocupará entre uno y cuatro bytes, con la intención de que los caracteres más comunes requieran menos espacio, proporcionando un tipo de compresión incorporada. La desventaja es que determinar los requisitos de longitud o tamaño de un fragmento de texto determinado se vuelve mucho más complicado.
ASCII es Unicode, pero Unicode no es ASCII
Para compatibilidad con versiones anteriores, los primeros 128 puntos de código Unicode representan los caracteres ASCII equivalentes. Dado que UTF-8 codifica cada uno de estos caracteres con un solo byte, cualquier texto ASCII también es un texto UTF-8. Unicode es un superconjunto de ASCII.
Sin embargo, como se muestra arriba, muchos archivos Unicode no se pueden usar en un contexto ASCII. Cualquier carácter que esté fuera de los límites se mostrará de forma inesperada, a menudo con caracteres sustituidos que son completamente diferentes de los previstos.
Uso moderno
Para la mayoría de los propósitos, ASCII se considera en gran medida un estándar heredado. Incluso en situaciones que solo admiten la escritura latina, donde el soporte completo para las complejidades de Unicode es innecesario, por ejemplo, generalmente es más conveniente usar UTF-8 y aprovechar su compatibilidad ASCII.
En particular, las páginas web deben guardarse y transmitirse utilizando UTF-8, que es el predeterminado para HTML5. Esto contrasta con la web anterior, que trataba en ASCII de forma predeterminada antes de que fuera reemplazada por Latin 1.
Un estándar que está cambiando
La última revisión de ASCII tuvo lugar en 1986.
Por el contrario, Unicode continúa actualizándose anualmente. Regularmente se agregan nuevos guiones, personajes y, particularmente, nuevos emoji. Con solo una pequeña fracción de estos asignados, es probable que el conjunto de caracteres completo crezca y crezca en el futuro previsible.
ASCII frente a Unicode
ASCII cumplió su propósito durante muchas décadas, pero Unicode ahora lo ha reemplazado de manera efectiva para todos los propósitos prácticos que no sean sistemas heredados. Unicode es más grande y, por tanto, más expresivo. Representa un esfuerzo de colaboración mundial y ofrece una flexibilidad mucho mayor, aunque a expensas de cierta complejidad.