UTF-8

Revisión del 13:45 8 ago 2014 de Edeliochajc (discusión | contribuciones)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
UTF-8
Información sobre la plantilla
UTF-8.jpg
Ejemplo del sistema de codificación UTF-8

UTF-8. (8-bit Unicode Transformation Format). Es una norma de transmisión de longitud variable para codificación de caracteres codificados utilizando Unicode, creada por Rob Pike y Ken Thompson. UTF-8 usa grupos de bytes para representar el estándar de Unicode para los alfabetos de muchos de los lenguajes del mundo. Es especialmente útil para la transmisión sobre sistemas de correo de 8 bits.

Usa de 1 a 4 bytes por caracter, dependiendo del símbolo de Unicode. Por ejemplo, se necesita un solo byte en UTF-8 para codificar los 128 caracteres ASCII|US-ASCII en el rango U+0000 a U+007F de Unicode.

Aunque podría parecer ineficiente representar caracteres Unicode con hasta 4 bytes, UTF-8 permite a sistemas antiguos transmitir caracteres de este superconjunto de ASCII. Además, sigue siendo posible utilizar compresión de datos independientemente del uso de UTF-8.

El IETF requiere que todos los protocolos de Internet indiquen qué código de caracteres|codificación utilizan para los textos y que UTF-8 sea una de las codificaciones contempladas.

Descripción

UTF-8 está actualmente estandarizado como RFC 3629 (UTF-8, una transformación de formato de ISO 10646).

En resumen, los bits de carácter Unicode son divididos en varios grupos, los cuales son después divididos entre las posiciones más bajas dentro de los bytes UTF-8.

Los caracteres más pequeños que 128dec son codificados con un byte sencillo que contiene su valor: este corresponde exactamente a los caracteres de 7-bit de los 128 del ASCII.

En los demás casos, se utilizan de 2 a 4 bytes. El bit más significativo de todos los bytes de esta cadena es siempre 1, para prevenir la confusión con los caracteres de 7-bits del ASCII, particularmente los caracteres menores a 32dec, tradicionalmente llamados caracteres de control, ej. retorno de carro).


Rango de Código
UNICODE
hexadecimal
UTF-16 UTF-8
sistema binario|binario
Notas
000000 - 00007F 00000000 0xxxxxxx 0xxxxxxx Rango equivalente a ASCII; el único byte comienza con cero
000080 - 0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx El primer byte comienza con 110 o 1110, los bytes siguientes comienzan con 10
000800 - 00FFFF xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 110110xx xxxxxxxx
110111xx xxxxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx UTF-16 require sustitutos; una compensación de 0x10000 es substraída, así el bit patrón no es idéntico con UTF-8

Por ejemplo, el carácter eñe (ñ), que se representa en Unicode como 0x00F1, en UTF-8 se codifica de esta manera:

  • Su valor se sitúa en el rango de 0x0080 a 0x07FF. Una consulta a la tabla permite ver que debe ser codificado usando 2 bytes, con el formato 110xxxxx 10xxxxxx.
  • El valor hexadecimal 0x00F1 es equivalente al binario (0000-0)000-1111-0001 (los primeros 5 bits se ignoran, ya que no son necesarios para representar valores en el rango especificado).
  • Los 11 bits requeridos se sitúan ordenados en la posición marcada por las equis: 11000011 10110001.
  • El resultado final son dos bytes con los valores hexadecimales 0xC3 0xB1. Ese es el código de la letra eñe en UTF-8.

De este modo, los primeros 128 caracteres necesitan un byte. Los siguientes 1920 caracteres necesitan dos bytes para ser codificados. Esto incluye caracteres del Alfabeto Latino con Diacrítico, Alfabeto griego, Alfabeto cirílico, Alfabeto copto|copto, Alfabeto armenio, Alfabeto hebreo y Alfabeto arábigo. El resto de los caracteres UCS-2 usan tres bytes y caracteres adicionales son codificados con 4 bytes. (Una especificación inicial permitía aún más códigos para ser representados, usando 5 ó 6 bytes, pero no fue muy bien aceptado.)

De hecho, UTF-8 permite usar una secuencia de 6 bytes y cubrir completamente el rango 0x00-0x7FFFFFFF (31 bits), pero UTF-8 fue restringido por RFC 3629 para usar solamente el área cubierta por la definición formal de Unicode, 0x00-0x10FFFF, en noviembre de 2003. Antes de esto, sólo los bytes 0xFE y 0xFF no ocurrían en el texto codificado UTF-8. Después de haberse introducido este límite, el número de bytes no usados en una cadena UTF-8 se incrementó a 13 bytes: 0xC0, 0xC1, 0xF5-0xFF. Aunque esta nueva definición limita el área de codificación severamente, el problema de flujos muy largos (diferentes maneras de codificar el mismo carácter, lo cual puede ser un riesgo para la seguridad) es eliminado, por que flujos muy largos contendrían algunos de estos bytes que no son usados y por lo tanto no sería una secuencia válida.

Razonamiento detrás de la mecánica de UTF-8

Como una consecuencia de la exacta mecánica de UTF-8, se muestran las siguientes propiedades de secuencia multi-byte:

  • El bit más significativo de un carácter de byte-simple es siempre 0.
  • Los bits más significativos del primer byte de una secuencia multi-byte determinan la longitud de la secuencia. Estos bits más significativos 110 para secuencias de dos bytes; 1110 para secuencias de tres bytes, etc.
  • Los bytes restantes en una secuencia multi-byte tienen 10 como sus 2 bits más significativos.

UTF-8 fue diseñado para satisfacer estas propiedades, de forma que se garantiza que ninguna secuencia de bytes de un carácter esté contenida dentro de una secuencia de bytes más larga de otro carácter. Esto asegura que la correspondencia de subcadenas puede ser aplicada para buscar palabras o frases dentro de un texto; algunas viejas codificaciones de longitud variable de 8-bits (tal como Shift-JIS) no tenían esta propiedad y de este modo hacían más complicado implementar algoritmos de búsqueda de cadenas. Aunque se ha argumentado que esta propiedad añade redundancia al texto codificado en UTF-8, las ventajas pesan más que esta preocupación; además, la compresión de datos no es uno de los objetivos de Unicode y debe ser considerado por separado.

Ventajas

  • Por supuesto, la ventaja más notable de cualquier Formato de Transformación Unicode sobre codificaciones heredadas es que este puede codificar cualquier carácter.
  • Algunos símbolos Unicode (incluido el Alfabeto latino) se tomarán como 1 byte, aunque otros pueden tomar más de 4. Así, UTF-8 generalmente ahorrará espacio comparado con UTF-16 o UTF-32 en donde los caracteres ASCII de 7 bits son comunes.
  • Una secuencia de bytes para un carácter jamás será parte de una secuencia más larga de otro carácter como lo hacían viejas codificaciones como Shift-JIS.
  • El primer byte de una secuencia multi-byte es suficiente para determinar la longitud de una secuencia multi-byte-. Esto hace extremadamente simple extraer una subcadena de una cadena dada sin elaborar un análisis exhaustivo.
  • La mayor parte del software existente (incluido el sistema operativo) no fueron escritos con Unicode en mente, y usar Unicode con ellos podría crear algunos problemas de compatibilidad. Por ejemplo, la librería estándar del lenguaje de programación C marca el final de una cadena con el carácter de un único byte 0x00. En la codificación Unicode UTF-16 la letra A en inglés es codificada como 0x0041. La librería considerará el primer byte 0x00 como el fin de la cadena e ignorará el resto. UTF-8, sin embargo, está diseñado para que los bytes codificados nunca tomen alguno de los valores de los caracteres especiales de ASCII, previniendo estos problemas y otros similares.
  • Las cadenas en UTF-8 pueden ser ordenadas usando rutinas de ordenamiento estándar orientadas a byte (sin embargo no habrá ninguna diferenciación entre las mayúsculas y las minúsculas con representaciones que exceden el valor 128).
  • UTF-8 es el valor predeterminado para el formato XML.

Desventajas

  • UTF-8 es de longitud variable; eso significa que diferentes caracteres toman secuencias de diferentes longitudes para codificar. La agudeza de esto podría ser disminuida, sin embargo, creando una interfaz abstracta para trabajar con cadenas UTF-8 y haciéndolo transparente al usuario.
  • Un analizador de UTF-8 mal escrito podría aceptar un número de diferentes representaciones pseudo-UTF-8 y convertirlas en la misma salida Unicode.
  • Los caracteres ideográficos usan 3 bytes en UTF-8, pero sólo 2 en UTF-16. Así, los textos chinos/japoneses/coreanos usarán más espacio cuando sean representados en UTF-8.

Historia

UTF-8 fue inventado por Ken Thompson el 2 de septiembre de 1992 en un mantel de un merendero de Nueva Jersey con Rob Pike. Al día siguiente, Pike y Thompson lo implementaron e implantaron en su sistema operativo Plan 9.

UTF-8 fue oficialmente presentado en la conferencia USENIX en San Diego (California)en Enero de 1993.

Enlaces externos

Fuente