¿Cuál es la ventaja de elegir la codificación ASCII sobre UTF-8?

91

Todos los caracteres en ASCII pueden codificarse utilizando UTF-8 sin un aumento en el almacenamiento (ambos requieren un byte de almacenamiento).

UTF-8 tiene el beneficio adicional de soporte de caracteres más allá de los "caracteres ASCII". Si ese es el caso, ¿por qué alguna vez elegiremos la codificación ASCII sobre UTF-8?

¿Hay un caso de uso cuando elegiremos ASCII en lugar de UTF-8?

Pacerier
fuente
99
Para admitir cosas heredadas ...
fretje
99
Me refiero a que el UTF8 también es compatible con ASCII. así que incluso si tiene que admitir material heredado, UTF8 funcionaría bien sin otros cambios necesarios.
Pacerier
3
¿Quizás deba interoperar con un sistema que incluye 8 caracteres ASCII en 7 bytes? La gente hizo cosas locas para encajar.
Donal Fellows
44
Llámame loco, pero diría seguridad y estabilidad. Un conjunto de caracteres sin secuencias de varios bytes es mucho más difícil de romper. No me malinterpreten, cuando el soporte del lenguaje humano es importante, ASCII no lo cortará. Pero si solo está haciendo una programación básica y puede introducirse en el idioma nativo para el que se compiló el compilador y el sistema operativo, ¿por qué agregar la complejidad? @Donal Fellows. Lo último que comprobé ... ASCII es de 7 bytes. (cualquier cosa con ese bit extra simplemente no es ASCII y está pidiendo problemas)
ebyrob
2
@ebyrob Creo que Donal Fellows significa un paquete de 8 símbolos ascii en 7 bytes, ya que cada símbolo usa 7 bits cada uno ... 8 * 7 = 56 bits = 7 bytes. Significaría una función especial de codificación y decodificación, solo para ahorrar 1 byte de almacenamiento de cada 8.
dodgy_coder

Respuestas:

83

En algunos casos, puede acelerar el acceso a caracteres individuales. Imagine una cadena str='ABC'codificada en UTF8 y en ASCII (y suponiendo que el idioma / compilador / base de datos sepa sobre codificación)

Para acceder al tercer carácter ( C) desde esta cadena utilizando el operador de acceso a matriz que se presenta en muchos lenguajes de programación, haría algo como c = str[2].

Ahora, si la cadena está codificada en ASCII, todo lo que tenemos que hacer es obtener el tercer byte de la cadena.

Si, sin embargo, la cadena está codificada en UTF-8, primero debemos verificar si el primer carácter es un carácter de uno o dos bytes, entonces debemos realizar la misma verificación en el segundo carácter, y solo entonces podemos acceder al tercer carácter. La diferencia en el rendimiento será cuanto más grande, más larga es la cuerda.

Este es un problema, por ejemplo, en algunos motores de bases de datos, donde para encontrar el comienzo de una columna colocada 'después' de un VARCHAR codificado en UTF-8, la base de datos no solo necesita verificar cuántos caracteres hay en el campo VARCHAR, sino también cómo muchos bytes que usa cada uno de ellos.

Mchl
fuente
3
Si la base de datos no almacena tanto el "conteo de caracteres" como el "conteo de bytes", entonces diría que tiene algunos problemas ...
Dean Harding
1
TBH, no conozco ninguna base de datos que pueda almacenar ...
Mchl
@Mchl: ¿cómo imagina que la base de datos sabe cuándo ha llegado al final de la cadena?
Kevin Cline
1
Por lo general, al llegar a 0x00 o 0x0000
Mchl
44
@DeanHarding ¿Cómo te cuenta el personaje dónde comienza el segundo personaje? ¿O debería la base de datos contener un índice para cada desplazamiento de caracteres también? Nota: No son solo 2 caracteres, sino que pueden tener hasta 4 (a menos que sean 6) stackoverflow.com/questions/9533258/… . (Creo que solo utf-16 tuvo las abominaciones realmente largas que podrían destruir su sistema)
ebyrob
7

Si va a usar solo el subconjunto US-ASCII (o ISO 646) de UTF-8, entonces no hay una ventaja real para uno u otro; de hecho, todo está codificado de forma idéntica.

Si va a ir más allá del conjunto de caracteres ASCII de EE. UU. Y usar (por ejemplo) caracteres con acentos, diéresis, etc., que se usan en los idiomas típicos de Europa occidental, entonces hay una diferencia: la mayoría de estos todavía pueden se codificará con un solo byte en ISO 8859, pero requerirá dos o más bytes cuando se codifique en UTF-8. También hay, por supuesto, desventajas: ISO 8859 requiere que use algunos medios fuera de banda para especificar la codificación que se está utilizando, y solo admite unode estos idiomas a la vez. Por ejemplo, puede codificar todos los caracteres del alfabeto cirílico (ruso, bielorruso, etc.) utilizando solo un byte cada uno, pero si necesita / desea mezclarlos con caracteres franceses o españoles (distintos de los de EE. UU.-ASCII) / ISO 646 subconjunto) no tienes suerte, tienes que cambiar completamente los conjuntos de caracteres para hacerlo.

ISO 8859 es realmente solo útil para alfabetos europeos. Para admitir la mayoría de los alfabetos utilizados en la mayoría de los alfabetos chinos, japoneses, coreanos, árabes, etc., debe usar una codificación completamente diferente. Algunos de estos (por ejemplo, Shift JIS para japonés) son un dolor absoluto con el que lidiar. Si hay alguna posibilidad de que alguna vez quieras apoyarlos, consideraría que vale la pena usar Unicode por si acaso.

Jerry Coffin
fuente
5

ANSI puede ser muchas cosas, la mayoría son juegos de caracteres de 8 bits a este respecto (como la página de códigos 1252 en Windows).

Quizás estaba pensando en ASCII, que es de 7 bits y un subconjunto adecuado de UTF-8. Es decir, cualquier transmisión ASCII válida también es una transmisión UTF-8 válida.

Si estaba pensando en conjuntos de caracteres de 8 bits, una ventaja muy importante sería que todos los caracteres representables son exactamente de 8 bits, donde en UTF-8 pueden tener hasta 24 bits.


fuente
Sí, estoy hablando del conjunto ASCII de 7 bits. ¿Puedes pensar en 1 ventaja que necesitaremos para guardar algo como ASCII en lugar de UTF-8? (ya que el 7-bit se guarda como 8 bits de todos modos, el tamaño del archivo sería exactamente el mismo)
Pacerier
1
Si tiene caracteres mayores que el valor Unicode 127, no se pueden guardar en ASCII.
1
@Pacerier: cualquier cadena ASCII es una cadena UTF-8 , por lo que no hay diferencia . La rutina de codificación puede ser más rápida dependiendo de la representación de cadena de la plataforma que use, aunque no esperaría una aceleración significativa, mientras que tiene una pérdida significativa de flexibilidad.
back2dos
@Thor eso es exactamente por qué estoy preguntando si guardar como ASCII tiene alguna ventaja
Pacerier
55
@Pacerier, si guarda XML como ASCII, debe usar, por ejemplo, & # 160; para un espacio no rompible. Esto es más contundente, pero hace que sus datos sean más resistentes a los errores de codificación ISO-Latin-1 frente a UTF-8. Esto es lo que hacemos, ya que nuestra plataforma subyacente hace mucha magia invisible con los personajes. Mantenerse en ASCII hace que nuestros datos sean más sólidos.
3

Sí, todavía hay algunos casos de uso en los que ASCII tiene sentido: formatos de archivo y protocolos de red . En particular, para usos donde:

  • Tiene datos generados y consumidos por programas informáticos, nunca presentados a los usuarios finales;
  • Pero lo cual es útil para que los programadores puedan leer, para facilitar el desarrollo y la depuración.

Al utilizar ASCII como codificación, evita la complejidad de la codificación de varios bytes y conserva al menos cierta legibilidad humana.

Un par de ejemplos:

  • HTTP es un protocolo de red definido en términos de secuencias de octetos, pero es muy útil (al menos para los programadores de habla inglesa) que corresponden a la codificación ASCII de palabras como "GET", "POST", "Accept-Language" y pronto.
  • Los tipos de fragmentos en el formato de imagen PNG consisten en cuatro octetos, pero es útil si está programando un codificador o decodificador PNG que IDATsignifica "datos de imagen" y PLTEsignifica "paleta".

Por supuesto, debe tener cuidado de que los datos realmente no se presenten a los usuarios finales, porque si terminan siendo visibles (como sucedió en el caso de las URL), entonces los usuarios esperarán con razón que esos datos sean en un idioma que puedan leer.

Gareth Rees
fuente
Bien dicho. Es un poco irónico que HTTP, el protocolo que transmite el más unicode del planeta, solo necesita soportar ASCII. (En realidad, supongo que lo mismo ocurre con TCP e IP, soporte binario, soporte ASCII ... eso es todo lo que necesita en ese nivel de la pila)
ebyrob
2

En primer lugar: su título usa / d ANSI, mientras que en el texto se refiere a ASCII. Tenga en cuenta que ANSI no es igual a ASCII. ANSI incorpora el conjunto ASCII. Pero el conjunto ASCII está limitado a los primeros 128 valores numéricos (0 - 127).

Si todos sus datos están restringidos a ASCII (7 bits), no importa si usa UTF-8, ANSI o ASCII, ya que ANSI y UTF-8 incorporan el conjunto ASCII completo. En otras palabras: los valores numéricos 0 hasta 127 inclusive representan exactamente los mismos caracteres en ASCII, ANSI y UTF-8.

Si necesita caracteres fuera del conjunto ASCII, deberá elegir una codificación. Puede usar ANSI, pero luego se encuentra con los problemas de todas las páginas de códigos diferentes. Cree un archivo en la máquina A y léalo en la máquina B puede / producirá textos divertidos si estas máquinas están configuradas para usar páginas de códigos diferentes, simple porque el valor numérico nnn representa diferentes caracteres en estas páginas de códigos.

Este "infierno de la página de códigos" es la razón por la cual se definió el estándar Unicode . UTF-8 no es más que una codificación única de ese estándar, hay muchos más. UTF-16 es el más utilizado, ya que es la codificación nativa para Windows.

Entonces, si necesita admitir algo más allá de los 128 caracteres del conjunto ASCII, mi consejo es ir con UTF-8 . De esa manera, no importa y no tiene que preocuparse por la página de códigos que sus usuarios han configurado sus sistemas.

Marjan Venema
fuente
Si no necesito soportar más de 128 caracteres, ¿cuál es la ventaja de elegir la codificación ACSII sobre la codificación UTF8?
Pacerier
¿Además de limitarte a esos 128 caracteres? No mucho. UTF-8 fue diseñado específicamente para atender ASCII y la mayoría de los idiomas occidentales que "solo" necesitan ANSI. Encontrará que UTF-8 codificará solo un número relativamente pequeño de los caracteres ANSI superiores con más de un byte. Hay una razón por la cual la mayoría de las páginas HTML usan UTF-8 como predeterminado ...
Marjan Venema
1
@Pacerier, si no necesita una codificación superior a 127, puede valer la pena elegir ASCII cuando utiliza alguna API para codificar / decodificar, porque UTF necesita una verificación de bits adicional para considerar bytes adicionales como el mismo carácter, puede requerir un cálculo adicional en lugar de ASCII puro que solo lee 8 bits sin verificación. Pero solo le recomiendo que use ASCII si realmente necesita un alto nivel de optimización en cómputo grande (grande grande) y sabe lo que está haciendo en esa optimización. Si no, solo use UTF-8.
Luciano