UTF-8(7) Miscellaneous Information Manual UTF-8(7) NOMBRE UTF-8 - una codificacion Unicode multi-byte compatible con ASCII DESCRIPCION The Unicode 3.0 character set occupies a 16-bit code space. The most obvious Unicode encoding (known as UCS-2) consists of a sequence of 16-bit words. Such strings can contain--as part of many 16-bit characters--bytes such as '\0' or '/', which have a special meaning in filenames and other C library function arguments. In addition, the majority of UNIX tools expect ASCII files and can't read 16-bit words as characters without major modifications. For these reasons, UCS-2 is not a suitable external encoding of Unicode in filenames, text files, environment variables, and so on. The ISO/IEC 10646 Universal Character Set (UCS), a superset of Unicode, occupies an even larger code space--31 bits--and the obvious UCS-4 encoding for it (a sequence of 32-bit words) has the same problems. La codificacion 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 codificacion UTF-8 tiene los siguientes propiedades atractivas: o Los caracteres UCS 0x00000000 a 0x0000007f (el conjunto clasico 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 codificacion en ASCII y en UTF-8. o All UCS characters greater than 0x7f are encoded as a multibyte sequence consisting only of bytes in the range 0x80 to 0xfd, so no ASCII byte can appear as part of another character and there are no problems with, for example, '\0' or '/'. o Se preserva la enumeracion lexicografica de las cadenas UCS-4. o Los 2^31 codigos posibles UCS pueden codificarse con UTF-8. o Los bytes 0xc0, 0xc1, 0xfe y 0xff no se usan nunca en la codificacion UTF-8. o El primer byte de una secuencia multibyte que represente un caracter no ASCII UCS siempre se halla en el intervalo 0xc0 a 0xfd, e indica la longitud de la secuencia. El resto de los bytes de la secuencia se hallan en el intervalo 0x80 a 0xbf. Esto permite una facil resincronizacion y resulta en una codificacion sin estado y robusta frente a la perdida de bytes. o Los caracteres UCS codificados en UTF-8 pueden llegar a ser de 6 bytes, no obstante el estandar Unicode no especifica caracteres por encima de 0x10ffff, por lo tanto los caracteres Unicode solo pueden ser de 4 bytes como mucho en UTF-8. Codificacion Las siguientes secuencias de bytes se usan para representar un caracter. La secuencia a usar depende del codigo UCS correspondiente al caracter: 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 de la representacion binaria del numero de codigo del caracter, con el bit mas importante primero (big-endian). Solo se puede usar la secuencia mas corta que pueda representar el numero de codigo. Los valores del codigo UCS 0xd800-xdfff (sustitutos de UTF-16) asi como 0xfffe y 0xffff (caracteres no UCS) no deberian aparecer en flujos conformes con UTF-8. Segun el RFC 3629, no deberia emplearse ningun valor mas alla de U+10FFFF lo que limita los caracteres a cuatro bytes. Ejemplo El caracter Unicode 0xa9 = 1010 1001 (el signo de copyright) se codifica en UTF-8 como 11000010 10101001 = 0xc2 0xa9 y el caracter 0x2260 = 0010 0010 0110 0000 (el simbolo de "distinto que") se codifica como: 11100010 10001001 10100000 = 0xe2 0x89 0xa0 Observaciones sobre aplicaciones Los usuarios tiene que seleccionar una localizacion 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 codificacion de caracteres usada deben establecer siempre la localizacion mediante por ejemplo setlocale(LC_CTYPE, "") y los programadores pueden comprobar la expresion strcmp(nl_langinfo(CODESET), "UTF-8") == 0 para averiguar si se ha seleccionado una localizacion UTF-8 y por tanto toda la entrada y salida en texto plano, la comunicacion con la terminal, el contenido de ficheros con texto plano, los nombres de fichero y las variables de entorno estan codificadas en UTF-8. Los programadores que estan habituados a la codificacion de un solo byte como US-ASCII o ISO/IEC 8859 deben ser conscientes de que dos suposiciones hechas hasta ahora ya no son validas en las localizaciones UTF-8. En primer lugar, un solo byte ya no corresponde necesariamente a un unico caracter. En segundo lugar, dado que los emuladores de terminales modernos en el modo UTF-8 tambien admiten caracteres chinos, japoneses y coreanos de doble ancho, asi como caracteres de combinacion no espaciados, la salida de un unico caracter no necesariamente avanza el cursor una posicion como se hace en ASCII. Actualmente, deberian utilizarse funciones de biblioteca, como mbsrtowcs(3) y wcswidth(3), para contar los caracteres y las posiciones del cursor. The official ESC sequence to switch from an ISO/IEC 2022 encoding scheme (as used for instance by VT100 terminals) to UTF-8 is ESC % G ("\x1b%G"). The corresponding return sequence from UTF-8 to ISO/IEC 2022 is ESC % @ ("\x1b%@"). Other ISO/IEC 2022 sequences (such as for switching the G0 and G1 sets) are not applicable in UTF-8 mode. Seguridad Los estandares Unicode y UCS requieren que los fabricantes de UTF-8 usen la forma mas corta posible, p.ej: producir una secuencia de dos bytes que tenga como primer byte 0xc0 no se ajustaria al estandar. Unicode 3.1 anade el requisito de que los programas no deben aceptar en su entrada formas que no cumplan la condicion anterior. Esto es por motivos de seguridad: si un programa desea comprobar posibles violaciones de seguridad en la entrada del usuario, este podria verificar solamente la version ASCII de "/../" o ";" o NUL y pasar por alto las diferentes maneras no-ASCII de representar estas situaciones en una codificacion UTF-8 con formato no reducido. Estandares ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9. VEASE TAMBIEN locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7) TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Miguel Angel Sepulveda , Juan Piernas , Miguel Perez Ibars y Marcos Fouces Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Paginas de Manual de Linux 6.9.1 15 Junio 2024 UTF-8(7)