utf-8

UTF-8(7)                 Manual del Programador de Linux                UTF-8(7)



NOMBRE
       UTF-8 - una codificación Unicode mutibyte compatible con ASCII

DESCRIPCIÓN
       El conjunto de caracteres Unicode 3.0 ocupa un espacio de códigos de 16
       bits. La codificación Unicode más obvia (conocida como UCS-2) consiste en
       una secuencia de palabras de 16 bits. Tales cadenas pueden contener, como
       parte de muchos caracteres de 16 bits, bytes como '\0' or '/', que tienen
       un significado especial en nombres de ficheros y en otras variables de
       funciones de la biblioteca C. Además, la mayoría de las herramientas de
       UNIX esperan ficheros ASCII y no pueden leer palabras de 16 bits como
       caracteres sin considerables modificaciones. Por estas razones, UCS-2 no
       es una codificación externa apropiada de Unicode en nombres de ficheros,
       variables de entorno, etc. El ISO 10646 Universal Character Set (UCS), es
       un superconjunto de Unicode con un espacio de códigos de hasta 31 bits y
       la codificación obvia para dicho conjunto, UCS-4 (una secuencia de
       palabras de 32 bits), posee los mismos problemas.

       La codificación UTF-8 de Unicode y UCS carece de estos problemas y es la
       forma habitual de usar el conjunto de caracteres Unicode bajo sistemas
       operativos al estilo UNIX.

PROPIEDADES
       La codificación UTF-8 tiene los siguientes propiedades atractivas:

       * Los caracteres UCS 0x00000000 a 0x0000007f (el conjunto clásico de
         caracteres US-ASCII se codifican simplemente como los bytes 0x00 a
         0x7f (compatibilidad con ASCII) Esto significa que los ficheros y
         cadenas que contengan solamente caracteres ASCII de 7 bits tienen la
         misma codificación en ASCII y en UTF-8.

       * Todos los caracteres UCS
          > 0x7f se codifican como una secuencia multibyte formada solamente por
         bytes en el rango 0x80 a 0xfd, por tanto ningún byte ASCII puede
         aparecer como parte de otro carácter y no hay problemas con, por
         ejemplo,  '\0' or '/'.

       * Se preserva la enumeración lexicográfica de las cadenas UCS-4

       * Los  2^31 códigos posibles UCS pueden codificarse con UTF-8.

       * Los bytes 0xfe y 0xff no se usan nunca en la codificación UTF-8

       * El primer byte de una secuencia multibyte que represente un carácter no
         ASCII UCS siempre se halla en el rango  0xc0 a 0xfd, e indica la
         longitud de la secuencia. El resto de los bytes de la secuencia se
         hallan en el rango 0x80 a 0xbf. Esto permite una fácil resincronización
         y resulta en una codificación sin estado y robusta frente a la pérdida
         de bytes.

       * Los caracteres UCS codificados en UTF-8 pueden llegar a ser de 6 bytes,
         no obstante el estándar Unicode no especifica caracteres por encima de
         0x10ffff, por lo tanto los caracteres Unicode sólo pueden ser de 4
         bytes como mucho en UTF-8.

CODIFICACIÓN
       Las siguientes secuencias de bytes se usan para representar un carácter.
       La secuencia a usar depende del código UCS correspondiente al carácter:

       0x00000000 - 0x0000007F:
           0xxxxxxx

       0x00000080 - 0x000007FF:
           110xxxxx 10xxxxxx

       0x00000800 - 0x0000FFFF:
           1110xxxx 10xxxxxx 10xxxxxx

       0x00010000 - 0x001FFFFF:
           11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

       0x00200000 - 0x03FFFFFF:
           111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

       0x04000000 - 0x7FFFFFFF:
           1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

       Las posiciones xxx se rellenan con los bits del número de código del
       carcter representado en binario. Sólo se puede usar la secuencia más
       corta que pueda representar el número de código.

       Los códigos UCS 0xd800–0xdfff (sustitutos de UTF-16) así como 0xfffe y
       0xffff (caracteres no UCS) no deberían aparecer en flujos conformes con
       UTF-8 .

EJEMPLOS
       El carácter Unicode 0xa9 = 1010 1001 (el signo de copyright) se codifica
       en UTF-8 como

              11000010 10101001 = 0xc2 0xa9

       y el carácter 0x2260 = 0010 0010 0110 0000 (el símbolo de "distinto que")
       se codifica como:

              11100010 10001001 10100000 = 0xe2 0x89 0xa0

OBSERVACIONES SOBRE APLICACIONES
       Los usuarios tiene que seleccionar una localización UTF-8 , por ejemplo
       con

              export LANG=en_GB.UTF-8

       para poder activar el soporte de UTF-8 en las aplicaciones.

       Aquellas aplicaciones que deban ser conscientes de la codificación de
       caracteres usada deben establecer siempre la localización mediante por
       ejemplo

              setlocale(LC_CTYPE, "")

       y los programadores pueden comprobar la expresión

              strcmp(nl_langinfo(CODESET), "UTF-8") == 0

       para averiguar si se ha seleccionado una localización UTF-8 y por tanto
       toda la entrada y salida en texto plano, la comunicación con la terminal,
       el contenido de un fichero con texto plano, los nombres de fichero y las
       variables de entorno están codificadas en UTF-8.

       Los programadores acostumbrados a codificaciones de un sólo byte tales
       como US-ASCII o ISO 8859 deben ser conscientes de que dos suposiciones
       hechas hasta ahora ya no son válidas con localizaciones UTF-8.  En primer
       lugar, un byte ya no se corresponde necesariamente con un sólo carácter.
       En segundo lugar, puesto que los modernos emuladores de terminal en modo
       UTF-8 soportan también caracteres de doble-anchura del chino, japonés y
       coreano, así como caracteres combinantes de no espaciado, escribir en la
       salida un carácter individual no implica necesariamente avanzar el cursor
       una posición como sucedía en ASCII.  En la actualidad se deben usar
       funciones de biblioteca como mbsrtowcs(3) y wcswidth(3) para contar
       caracteres y posiciones del cursor.

       La secuencia de escape oficial para cambiar de un esquema de codificación
       ISO 2022 (como el que se utiliza por ejemplo en las terminales VT100) a
       UTF-8 es ESC % G ("\x1b%G"). La correspondiente secuencia de retorno de
       UTF-8 a ISO 2022 es ESC % @ ("\x1b%@"). Otras secuencias ISO 2022  (como
       para cambiar los conjuntos G0 y G1) no son aplicables en el modo UTF-8.

       Se espera que en un futuro previsible, UTF-8 reemplace a ASCII y ISO 8859
       en todos los niveles como la codificación de caracteres común en sistemas
       POSIX, llevando a un entorno significativamente más enriquecido para
       manejar texto plano.

SEGURIDAD
       Los estándares Unicode y UCS requieren que los fabricantes de UTF-8 usen
       la forma más corta posible, p.ej., producir una secuencia de dos bytes
       que tenga como primer byte 0xc0 no se ajustaría al estándar.  Unicode 3.1
       añade el requisito de que los programas conformes no deben aceptar en su
       entrada formas que no cumplan la condición anterior. Ésto es por motivos
       de seguridad: si un programa desea comprobar posibles violaciones de
       seguridad en la entrada del usuario, éste podría verificar solamente la
       versión ASCII de "/../" o ";" o NUL y pasar por alto las diferentes
       maneras no-ASCII de representar estas situaciones en una codificación
       UTF-8 con formato no reducido.

ESTÁNDARES
       ISO/IEC 10646-1:2000, Unicode 3.1, RFC 2279, Plan 9.

AUTOR
       Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>

VÉASE TAMBIÉN
       nl_langinfo(3), setlocale(3), charsets(7), unicode(7)



GNU                               11 mayo 2001                          UTF-8(7)