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

Todos los caracteres en ASCII se pueden codificar usando UTF-8 sin aumentar el almacenamiento (ambos requieren un byte de almacenamiento).

UTF-8 tiene la ventaja adicional de admitir caracteres más allá de los «caracteres ASCII». Si ese es el caso, ¿por qué alguna vez elegiremos la codificación ASCII en lugar de UTF-8?

¿Existe un caso de uso en el que elegiremos ASCII en lugar de UTF-8?

Comentarios

  • Para admitir material heredado …
  • Me refiero a que el UTF8 es heredado también es compatible con ASCII. Por lo tanto, incluso si tiene que admitir material heredado, UTF8 funcionaría bien, sin necesidad de otros cambios.
  • Tal vez ‘ tenga que interoperar con ¿Un sistema que empaqueta 8 caracteres ASCII en 7 bytes? La gente hizo cosas locas para encajar las cosas.
  • Llámame loco, pero yo ‘ d dice seguridad y estabilidad. Un conjunto de caracteres sin secuencias de varios bytes es mucho más difícil de romper. No ‘ me malinterpretes, cuando el soporte del lenguaje humano es importante ASCII ganó ‘ t cortarlo. Pero si ‘ solo está haciendo algo de programación básica y puede meterse en el lenguaje nativo el compilador y operando g system fueron escritos, ¿por qué agregar la complejidad? @Donal Fellows. La última vez que verifiqué … ASCII es 7 bytes. (cualquier cosa con ese bit extra no es ‘ t ASCII y está buscando problemas)
  • @ebyrob Creo que Donal Fellows significa que el bit empaqueta 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.

Respuesta

En algunos casos, puede acelerar el acceso a personajes individuales. Imagine una cadena str="ABC" codificada en UTF8 y en ASCII (y asumiendo que el lenguaje / compilador / base de datos sabe sobre codificación)

Para acceder a terceros (C) carácter de esta cadena utilizando el operador de acceso a la 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 buscar 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 de uno o dos bytes, luego debemos realizar la misma verificación en el segundo carácter, y solo entonces podemos acceder al tercer personaje. La diferencia en el rendimiento será mayor cuanto más larga sea la cadena.

Este es un problema, por ejemplo, en algunos motores de base de datos, donde 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 cuántos bytes usa cada uno de ellos.

Comentarios

  • Si la base de datos no ‘ t almacena el » recuento de caracteres » y el » número de bytes «, luego ‘ diga ‘ tiene algunos problemas …
  • TBH No conozco ninguna base de datos que pueda almacenar tampoco …
  • @Mchl: cómo ¿Se imagina que la base de datos sabe cuándo ha llegado al final de la cadena?
  • Por lo general, al llegar a 0x00 o 0x0000
  • @DeanHarding ¿Cómo le dice el recuento de caracteres dónde comienza el segundo carácter? ? ¿O la base de datos también debería contener un índice para cada desplazamiento de carácter? Nota: No es ‘ t solo 2 caracteres, pero puede tener hasta 4 (a menos que sea ‘ 6) stackoverflow.com/questions/9533258/… . (Creo que ‘ es el único utf-16 que tenía las abominaciones realmente largas que podrían destruir su sistema)

Respuesta

Si sólo va a utilizar 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 US-ASCII y utilizar (por ejemplo) caracteres con acentos, diéresis, etc., que se utilizan en Idiomas de Europa occidental, entonces hay una diferencia: la mayoría de estos todavía se pueden codificar con un solo byte en ISO 8859, pero requerirán dos o más bytes cuando se codifiquen en UTF-8. También existen, por supuesto, desventajas: ISO 8859 requiere que use algunos medios fuera de banda para especificar la codificación que se está usando, y solo admite uno de estos idiomas a la vez. Por ejemplo, puede codificar todos los caracteres del cirílico (ruso, bielorruso, etc.) alfabeto usando solo un byte cada uno, pero si necesita / desea mezclarlos con caracteres franceses o españoles (que no sean los del subconjunto US-ASCII / ISO 646), no tiene suerte; tiene que cambiar los conjuntos de caracteres para hacerlo.

ISO 8859 solo es útil para los alfabetos europeos. Para admitir la mayoría de los alfabetos utilizados en la mayoría de los alfabetos chinos, japoneses, coreanos, árabes, etc., debe utilizar algunas codificaciones completamente diferentes. Algunas de estas (p. ej., Shift JIS para japonés) son un verdadero dolor de cabeza. Si hay alguna posibilidad de que alguna vez quieras admitirlas, consideraría que vale la pena usar Unicode solo en caso.

Respuesta

ANSI puede ser muchas cosas, la mayoría son conjuntos de caracteres de 8 bits en este sentido (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 flujo ASCII válido también es un flujo UTF-8 válido.

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

Comentarios

  • sí, ‘ estoy hablando el conjunto ASCII de 7 bits. ¿Puedes pensar en una ventaja que alguna vez necesitaremos para guardar algo como ascii en lugar de utf-8? (dado que el de 7 bits se guardaría como de 8 bits de todos modos, el sería exactamente el mismo)
  • Si tiene caracteres más grandes que el valor Unicode 127, no se pueden guardar en ASCII.
  • @Pacerier: Cualquier cadena ASCII es una cadena UTF-8 , por lo que no hay diferencia . La rutina de codificación podría ser más rápida según la representación de cadena de la plataforma que uses, aunque yo no ‘ esperaría una aceleración significativa, mientras que tú tienes una pérdida significativa en flexibilidad.
  • @Thor, esa es exactamente la razón por la que ‘ me pregunto si guardar como ASCII tiene alguna ventaja
  • @Pacerier, si guarda XML como ASCII, debe usar, por ejemplo, & # 160; para un espacio irrompible. Esto es más completo, pero hace que sus datos sean más resistentes a los errores de codificación ISO-Latin-1 vs UTF-8. Esto es lo que hacemos, ya que nuestra plataforma subyacente hace mucha magia invisible con los personajes. Permanecer en ASCII hace que nuestros datos sean más sólidos.

Respuesta

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 en los que:

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

Al usar ASCII como su codificación, evita la complejidad de la codificación multibyte mientras conserva al menos algo de 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 se correspondan con la codificación ASCII de palabras como «GET», «POST», «Accept-Language», etc.
  • El tipos de fragmentos en el formato de imagen PNG constan de cuatro octetos, pero es útil si está programando un codificador o decodificador PNG que IDAT significa» datos de imagen «, y PLTE significa» paleta «.

Por supuesto que debe tenga cuidado de que los datos realmente no se vayan a presentar a los usuarios finales, porque si terminan siendo visibles (como sucedió en el caso de las URL), los usuarios van a esperar que los datos estar en un idioma que puedan leer.

Comentarios

  • Bien dicho. Es ‘ un poco irónico que HTTP, el protocolo que transmite la mayor cantidad de Unicode en el planeta, solo necesita ser compatible con ASCII. (En realidad, supongo que lo mismo ocurre con TCP e IP, soporte binario, soporte ASCII … que ‘ es todo lo que necesita en ese nivel de la pila)

Respuesta

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 tanto ANSI como UTF-8 incorporan el conjunto ASCII completo. En otras palabras: los valores numéricos del 0 al 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 diferentes páginas de códigos.Crear un archivo en la máquina A y leerlo en la máquina B puede producir textos de aspecto divertido si estas máquinas están configuradas para usar diferentes páginas de códigos, simple porque el valor numérico nnn representa diferentes caracteres en estas páginas de códigos.

Este «infierno de páginas de códigos» es la razón por la que 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.

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

Comentarios

  • Si no necesito admitir más de 128 caracteres, ¿cuál es la ventaja de elegir la codificación ACSII sobre la codificación UTF8?
  • ¿Además de limitarte a esos 128 caracteres? Poco. UTF-8 se diseñó específicamente para adaptarse a 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 que la mayoría de las páginas HTML usan UTF-8 como predeterminado …
  • @Pacerier, si no ‘ no necesita codificación por encima de 127, elegir ASCII puede valer la pena cuando usa alguna API para codificar / decodificar, porque UTF necesita verificación de bits adicional para considerar bytes adicionales como el mismo carácter, puede requerir cálculos adicionales en lugar de ASCII puro, que solo lee 8 bits sin verificación. Pero solo te recomiendo que uses ASCII si realmente necesitas un alto nivel de optimización en cálculos grandes (grandes grandes) y sabes lo que ‘ estás haciendo en esa optimización. De lo contrario, utilice UTF-8.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *