Scroll to navigation

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

NOMBRE

UTF-8 - una codificación Unicode multi-byte compatible con ASCII

DESCRIPCIÓN

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 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 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.

Properties

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.
*
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 '/'.
*
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 0xc0, 0xc1, 0xfe y 0xff no se usan nunca en la codificación UTF-8.
*
The first byte of a multibyte sequence which represents a single non-ASCII UCS character is always in the range 0xc2 to 0xfd and indicates how long this multibyte sequence is. All further bytes in a multibyte sequence are in the range 0x80 to 0xbf. This allows easy resynchronization and makes the encoding stateless and robust against missing 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

The xxx bit positions are filled with the bits of the character code number in binary representation, most significant bit first (big-endian). Only the shortest possible multibyte sequence which can represent the code number of the character can be used.

The UCS code values 0xd800–0xdfff (UTF-16 surrogates) as well as 0xfffe and 0xffff (UCS noncharacters) should not appear in conforming UTF-8 streams. According to RFC 3629 no point above U+10FFFF should be used, which limits characters to four bytes.

Ejemplo

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.

Programmers accustomed to single-byte encodings such as US-ASCII or ISO 8859 have to be aware that two assumptions made so far are no longer valid in UTF-8 locales. Firstly, a single byte does not necessarily correspond any more to a single character. Secondly, since modern terminal emulators in UTF-8 mode also support Chinese, Japanese, and Korean double-width characters as well as nonspacing combining characters, outputting a single character does not necessarily advance the cursor by one position as it did in ASCII. Library functions such as mbsrtowcs(3) and wcswidth(3) should be used today to count characters and cursor positions.

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.

Seguridad

The Unicode and UCS standards require that producers of UTF-8 shall use the shortest form possible, for example, producing a two-byte sequence with first byte 0xc0 is nonconforming. Unicode 3.1 has added the requirement that conforming programs must not accept non-shortest forms in their input. This is for security reasons: if user input is checked for possible security violations, a program might check only for the ASCII version of "/../" or ";" or NUL and overlook that there are many non-ASCII ways to represent these things in a non-shortest UTF-8 encoding.

Estándares

ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9.

VÉASE TAMBIÉN

locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)

COLOFÓN

Esta página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una descripción del proyecto, información sobre cómo informar errores y la última versión de esta página en https://www.kernel.org/doc/man-pages/.

TRADUCCIÓN

La traducción al español de esta página del manual fue creada por Miguel Angel Sepulveda <angel@vivaldi.princeton.edu>, Juan Piernas <piernas@ditec.um.es> y Miguel Pérez Ibars <mpi79470@alu.um.es>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a <debian-l10n-spanish@lists.debian.org>.

6 Marzo 2019 GNU