Home manjarrés

Códigos de caracteres

Un código de caracteres es aquel que asigna a cada carácter (letra, símbolo, de control …) un número para poder ser almacenado en la memoria de un ordenador.

ASCII

El código de caracteres más utilizado hasta no hace mucho, era el denominado código ASCII Extendido (American Standar Code for Information Interchange) en el que a cada carácter se le asigna un número comprendido entre 0 y 255 (256 caracteres distintos) que codificado en binario precisa de 8 bits = 1 byte para su almacenamiento.

En principio el código ASCII utilizó solo 7 bits (128 caracteres distintos y llamado simplemente ASCII) para la codificación de caracteres utilizando el 8º bit para control de errores. Posteriormente, debido a la necesidad de aumentar el número de caracteres codificables sobre todo para poder adaptarlo a las configuraciones de cada idioma distinto del inglés, se utilizan ya los ocho bits.

0 1 2 3 4 5 6 7 8 9 A B C D E F
0
1 §
2   ! " # $ & % ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | { ~
8 Ç ü é â ä à å ç ê ë è ï î ì Ä Å
9 É æ Æ ô ö ò û ù ÿ Ö Ü ¢ ¥ ƒ
A á í ó ú ñ Ñ ª º ¿ ¬ ½ ¼ ¡ « »
B
C
D
E α β Γ π Σ σ μ τ Φ Θ Ω δ φ ε
F ± ÷ ¨ ²  

Tabla de códigos ASCII

Los 32 primeros caracteres (dos primeras filas de la tabla que comienzan por 0 y 1) se dedican a los caracteres de control ya mencionados. En la fila 2 encontramos símbolos monetarios y operadores aritméticos. En la fila 3 encontramos los dígitos y operadores relacionales (nótese que los cuatro bits de la derecha del código de cada dígitos se corresponde con el propio dígito representado, así el código ASCII del carácter 8 es 38). En la fila 4 y 5 encontramos las letras mayúsculas del alfabeto inglés. En las filas 6 y 7 aparecen las letras minúsculas del alfabeto inglés (nótese que la diferencia entre el código de una letra mayúscula y de su minúscula es de 32 lo que facilita la conversión entre mayúsculas y minúsculas). De ahí en adelante, es decir, en los últimos 128 códigos aparecen caracteres para soporte de idiomas distintos del inglés y caracteres de dibujo en modo texto etc.

Los 128 últimos caracteres no tienen una representación gráfica fija, sino que dependen de la configuración regional de cada país. La representación anterior se corresponde con la página 850, de Europa occidental o Multilingual latin 1.

Si estuviéramos en la página 737 o Greek veríamos en los 128 últimos caracteres:

0 1 2 3 4 5 6 7 8 9 A B C D E F
8 Α Β Γ Δ Ε Ζ Η Ι Θ Κ Λ Μ Ν Ξ Ο Π
9 Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ
A ι κ λ μ ν ξ ο π ρ σ ς τ υ φ χ ψ
B
C
D
E ω ά έ ή ϊ ί ό ύ ϋ ώ Ά Έ Ή Ί Ό Ύ
F Ώ ± Ϊ Ϋ ÷ ° · ²  

Página de códigos 737

Unicode

Dadas las limitaciones de ASCII para representar caracteres en los distintos idiomas al inglés, se decidió la creación de un código que permitiera la representación de cualquier carácter, no solo alfabéticos sino también de simbología, etc. lo suficientemente amplio para que no se diesen estas limitaciones en el futuro.

Actualmente está extendido el uso del código Unicode que permite asignar a cada carácter en cualquier idioma un código único universal evitando los problemas que aparecían con el código ASCII en que según el idioma en el que estuviéramos trabajando, un mismo código podía representar caracteres distintos. Unicode incluye todos los caracteres de uso común en la actualidad. La versión 15 de septiembre de 2022 contiene 149.186 caracteres provenientes de alfabetos, sistemas ideográficos y colecciones de símbolos (matemáticos, técnicos, musicales, iconos...).

El elemento básico del estándar Unicode es el carácter. Se considera un carácter al elemento más pequeño de un sistema de escritura con significado. El estándar Unicode codifica los caracteres esenciales, grafemas, definiéndolos de forma abstracta y deja la representación visual (tamaño, dimensión, fuente o estilo) al software que lo trate, como procesadores de texto o navegadores web. Se incluyen letras, signos diacríticos, caracteres de puntuación, ideogramas, caracteres silábicos, caracteres de control y otros símbolos. Los caracteres se agrupan en alfabetos o sistemas de escritura. Se considera que son diferentes los caracteres de alfabetos distintos, aunque compartan forma y significación.

Códigos Unicode Los caracteres se identifican mediante un número o punto de código y su nombre o descripción. Cuando se ha asignado un código a un carácter, se dice que dicho carácter está codificado. El espacio para códigos tiene 1.114.112 posiciones posibles (\x10FFFF). Los puntos de código se representan utilizando notación hexadecimal agregando el prefijo U+. El valor hexadecimal se completa con ceros hasta 4 dígitos hexadecimales cuando es necesario. Si es de longitud mayor que 4 dígitos no se agregan ceros.

Tipos de caracteres

Los bloques del espacio de códigos contienen puntos con la siguiente información:

Composición de caracteres y secuencias

Códigos UnicodeComposición del carácter ñ. La primera es un carácter independiente, la segunda una n más una tilde (virgulilla) combinable.

Unicode incluye un mecanismo para formar caracteres y así extender el repertorio de compatibilidad con los símbolos existentes. Un carácter base se complementa con marcas: signos diacríticos, de puntuación o marcos. El tipo de cada carácter y sus atributos definen el papel que pueden jugar en una combinación. Por este motivo, puede haber varias opciones que representen el mismo carácter. Para facilitar la compatibilidad con codificaciones anteriores, se proporcionan caracteres precompuestos. En la definición de dichos caracteres se hace constar qué caracteres intervienen en la composición.

Formalmente, la base de datos se divide en planos y estos a su vez en áreas y bloques. Con excepciones, los caracteres codificados se agrupan en el espacio de códigos siguiendo categorías como alfabeto o sistema de escritura, de forma que caracteres relacionados se encuentren cerca en tablas de codificación.

Planos

Por conveniencia se ha dividido el espacio de códigos en grandes grupos denominados planos. Cada plano contiene un máximo de 65.535 caracteres. Dado un punto de código expresado en hexadecimal, los 4 últimos dígitos determinan la posición del carácter en el plano.

Áreas y bloques

Los distintos planos se dividen en áreas de direccionamiento en función de los tipos generales que incluyen. Esta división es convencional, no reglada y puede variar con el tiempo. Las áreas se dividen, a su vez, en bloques. Los bloques están definidos normativamente y son rangos consecutivos del espacio de códigos. Los bloques se utilizan para formar las tablas impresas de caracteres pero no deben tomarse como definiciones de grupos significativos de caracteres.

UTF-X

Unicode define tres formas de codificación bajo el nombre UTF (Unicode Transformation Format).

UTF-8

Es una norma de transmisión o de almacenamiento en memorias electrónicas de caracteres utilizada junto con la norma de codificación Unicode y sus características principales son:

Utilizadas en conjunto, funcionan de la siguiente manera:

Unicode asigna los enteros del 0 al 127 (un total de 128) a exactamente los mismos caracteres que ASCII. UTF-8 empaqueta cualquier entero del 0 al 127 en un octeto a la antigua pero con el octavo dígito siempre en cero, ya que actualmente el bit de paridad no se utiliza más para detección de errores.

Como la tabla de Unicode es tan grande, la mayoría de sus símbolos están asignados a enteros mayores que 127 (códigos que, en consecuencia, necesitan más que 7 dígitos para su representación binaria). En todos esos casos, UTF-8 envía el comienzo de la representación binaria del código en cuestión, en un primer octeto con dígito de paridad 1. El receptor de este mensaje, interpreta este dígito en 1 como señal de que lo que está siendo transmitido es un código que no cabe en 7 dígitos binarios; y por tanto determina que el símbolo no lo va a conocer mientras no lea el siguiente octeto y tal vez el siguiente.

UTF-8 divide los caracteres Unicode en varios grupos, en función del número de bytes necesarios para codificarlos. El número de bytes depende exclusivamente del código de carácter asignado por Unicode y del número de bytes necesario para representarlo. La distribución de caracteres es la siguiente:

Una propiedad importante de la codificación es que 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 y 11110 para cuatro bytes. Estos bits además proporcionan la información de sincronía que permite identificar el inicio de un símbolo.

La tabla siguiente muestra la forma en que se codifican los caracteres. Los valores fijos al principio de cada byte garantizan el cumplimento del principio de no superposición, pues son distintos en función de la posición del byte en la cadena

Rango de puntos UNICODE Valor escalar UTF-8 Notas
000000-00007F 00000000 0xxxxxxx 0xxxxxxx Rango equivalente a ASCII. Símbolos de un único byte donde el bit más significativo es 0
000080-0007FF 00000yyy yyxxxxxx 110yyyyy 10xxxxxx Símbolos de dos bytes. El primer byte comienza con 110, el segundo byte comienza con 10
000800-00FFFF zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx Símbolos de tres bytes. El primer byte comienza con 1110, los bytes siguientes comienzan con 10
010000-10FFFF 000uuuuu zzzzyyyy yyxxxxxx 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx Símbolos de cuatro bytes. El primer byte comienza con 11110, los bytes siguientes comienzan con 10

 

La tabla que el consorcio Unicode publica para ser leída por humanos, contiene una representación gráfica o descripción, de cada carácter incluido hasta ese momento; pero, los sistemas de visualización de documentos, para poder funcionar, requieren tablas de tipografía ,fonts, que asocian un grafema (dibujo) a cada carácter que abarcan, y sucede que hay muchísimas tablas de tipografía, con nombres como Arial o Times, que dibujan una misma letra a base de matrices diferentes y en diferentes estilos ("A" o "A"), sin embargo, la gran mayoría de las fuentes tipográficas contienen sólo un pequeño subconjunto de todos los caracteres Unicode. Por este motivo, para leer páginas con caracteres asiáticos, por ejemplo, no basta que el visualizador usado acepte la codificación Unicode, sino que, además, el ordenador debe tener instalada una tabla tipográfica suficientemente extensa.

UTF-16

Al igual que UTF-8, es una norma de transmisión utilizada junto con la norma de codificación Unicode. Tiene las mismas características que UTF-8 en cuanto a que es capaz de representar cualquier carácter Unicode, que incluye la especificación ASCII de 7 bits y que incluye sincronía y no superposición.

Al igual que UTF-8, usa símbolos de longitud variable, pero lo hace con 2 u 4 bytes cambiando por lo tanto la forma en que se codifican los códigos Unicode:

                               
                    \xAAAAAA - \x010000 =  \xBBBBB   =  cccccccccc dddddddddd
                
                    110110 cccccccccc    110111 dddddddddd

 

Ejemplo: código Unicode \u08 43 1B

                    código Unicode  -   rango BMP
                    \x08 43 1B           -   \x01 00 00 = \x07 43 1B =     0111 0100 0011 0001 1011      20 bits

                    1101 1001 1101 0000       1101 1111 0001 1011  = \xD9 D0 DF 1B  código UTF-16 

 

Históricamente, el hardware del ordenador ha procesado entidades de dos octetos como como enteros de 16 bits de dos maneras: El llamado big-endian en el que el octeto de orden superior está en la dirección inferior de la memoria. El octeto de orden superior por lo tanto, aparece primero en el flujo de datos. Por otro lado, little-endian en el que el octeto orden inferior aparece primero. El hardware de ambos tipos es común hoy en día.

Por ejemplo, el entero de 16 bits sin signo que representa el decimal el número 258 es \x0102. La serialización big-endian de ese número es el octeto \x01 seguido del octeto \x02. En little-endian la serialización de ese número es el octeto \x02 seguido del octeto \x01.

El ejemplo anterior de código Unicode a UTF-16 ha supuesto el método big-endian y como tipo MIME debería haber sido etiquetado como UTF-16BE. Si se hubiera utilizado el método little-endian el código sería \xD0 D9 1B DF y el tipo MIME debería ser etiquetado UTF-16LE. Si el tipo MIME hubiera sido etiquetado UTF-16 la cadena de texto debería comenzar con \xFEFF para indicar big-endian o con \xFFFE para indicar little-endian. Este primer carácter se denomina BOM mark.

UTF-32

Es el más sencillo de todos. Utiliza 4 bytes y el código es el mismo de Unicode pero almacenado en 4 bytes. Así el código UTF-32 del código Unicode \u190F1 es \x000190F1. Aunque es el más sencillo es el que más espacio de memoria desperdicia: para almacenar caracteres del ASCII básico UTF-32 utiliza 4 bytes cuando en UTF-8 solo necesitaría 1 y en UTF-16 2

Ejemplos

1. ¿Cual es el código ASCII, Unicode, UTF-8 y UTF-16 del carácter A?

Según la tabla ASCII estaría en la fila 4, columna 1, por lo tanto su código ASCII es \x41. Como pertenece al plano básico su código Unicode será \u0041. El código UTF-8, por ser un carácter de los primeros 128, se almacenará en un byte con valor \x41. En UTF-16 se precisarán 2 bytes con valor \x0041.

2. ¿Cuál es el código UTF-8 y UTF-16 del carácter con código Unicode \u00CF?

El carácter con código \u00CF se corresponde con el carácter Ï y nombre Latin Capital Letter I with Diaeresis. Pertenece al plano básico de caracteres Unicode. En UTF-8 el código \u00CF se encuentra dentro del rango 000080-0007FF, y por lo tanto precisará 2 bytes. El primero empezará por 110 y el segundo por 10, en el resto de los bits se codificará el código Unicode que en binario es 1100 1111. Los dos bytes quedarán:

        1100 0011 1000 1111
    

El código UTF-8 es, por tanto, \xC3 8F

En UTF-16, por pertenecer al plano básico su codificación, coincide con la codificación Unicode y por lo tanto el código UTF-16 es \x00CF

3. ¿Cuál es el código UTF-8 y UTF-16 del carácter con código Unicode \uCF16?

El carácter con código \uCF16 se corresponde con el carácter y nombre Hangul Syllable Kej. Pertenece al plano básico de caracteres Unicode. En UTF-8 el código \uCF16 se encuentra dentro del rango 000800-00FFFF, y por lo tanto precisará 3 bytes. El primero empezará por 1110 y los siguientes por 10. En el resto de los bits se codificará el código Unicode que en binario es 1100 1111 0001 0110. Los tres bytes quedarán:

        1110 1100   1011 1100   1001  0110

El código UTF-8 es, por tanto, \xEC BC 96

En UTF-16, por pertenecer al plano básico, su codificación coincide con la codificación Unicode y por lo tanto el código UTF-16 es \xCF16

4. ¿Cuál es el código UTF-8 y UTF-16 del carácter con código Unicode \u1CF16?

El carácter con código \u1CF16 es un carácter no definido aún en Unicode y pertenece al plano SMP ( Supplementary Multilingual Plane).

En UTF-8 el código \u1CF16 se encuentra en el rango 010000-10FFFF y por lo tanto precisará de 4 bytes. El primero empezará por 11110 y los siguientes por 10. En el resto de los bits se codificará el código Unicode que en binario es 0000 0001 1100 1111 0001 0110. Los cuatro bytes quedarán:

        1111 0000     1001 1100    1011 1100   1001  0110

El código UTF-8 es, por tanto, \xF0 9C BC 96

En UTF-16 al no pertenecer al plano básico precisará de dos bloques de 16 bits. El primero empezará por 110110 y el segundo por 110111. En el resto de los bits se codificará el código Unicode que en binario es 0001 1100 1111 0001 0110. Los dos bloques de 16 bits quedarán:

        1101 1000 0111 0011      1101 1111 0001  0110        
    

El código UTF-8 es, por tanto, \xD8 73 DF 16.

5. ¿Cuál es el código Unicode del carácter con código UTF-8 \xC2A3?

Si el código UTF-8 tiene dos bytes significa que será un valor en el rango Unicode 000080-0007FF y el primer byte debería empezar con 110 y el segundo con 10 estando codificado el código Unicode en los bits restantes.

En binario el código UTF-8 \xC2A3 es 1100 0010 1010 0011 viéndose que, efectivamente, el primer byte comienza por 110 y el segundo por 10, siendo por tanto una codificación válida. El resto de bits es 0 0010 10 0011 que es el código Unicode del carácter representado y que en hexadecimal es \u00A3 que se corresponde con el carácter £ y nombre Pound Sign

6. ¿Cuál es el código Unicode del carácter con código UTF-8 \xE2889A?

Si el código UTF-8 tiene tres bytes significa que será un valor en el rango b Unicode 000800-00FFFF y el primer byte debería empezar con 1110 y los siguientes con 10 estando codificado el código Unicode en los bits restantes.

En binario el código UTF-8 \xE2889A es 1110 0010 1000 1000 1001 1010 viéndose que, efectivamente, el primer byte comienza por 1110 y los siguientes por 10, siendo por tanto una codificación válida. El resto de bits es 0010 00 1000 01 1010 que es el código Unicode del carácter representado y que en hexadecimal es \u221A que se corresponde con el carácter y nombre Square Root

7. ¿Cuál es el código Unicode del carácter con código UTF-8 \xF092889A?

Si el código UTF-8 tiene cuatro bytes significa que será un valor en el rango Unicode 010000-10FFFF y el primer byte debería empezar con 11110 y los siguientes con 10 estando codificado el código Unicode en los bits restantes.

En binario el código UTF-8 \xF092889A es 1111 0000 1001 0010 1000 1000 1001 1010 viéndose que, efectivamente, el primer byte comienza por 11110 y los siguientes por 10, siendo por tanto una codificación válida. El resto de bits es 000 01 0010 00 1000 01 1010 que es el código Unicode del carácter representado y que en hexadecimal es b \u1221A que se corresponde con el carácter 𒈚 y nombre Cuneiform Sign Lugal Sheshig

8. ¿Cuál es el código Unicode del carácter con código UTF-16 \xD808DE1A ?

Si el código UTF-16 tiene cuatro bytes significa que será un Unicode fuera del plano básico y el primer bloque de 16 bits debería empezar con 110110 y el segundo por 110111 estando codificado el código Unicode en los bits restantes.

En binario el código UTF-16 \xD808DE1A es 1101 1000 0000 1000 1101 1110 0001 1010 viéndose que, efectivamente, el primer byte comienza por 110110 y el segundo por 110111, siendo por tanto una codificación válida. El resto de bits es 00 0000 1000 10 0001 1010 que es el código Unicode menos \x10000 del carácter representado y que en hexadecimal es \x221A, le sumamos \x10000 y obtendremos el código Unicode \u1221A que se corresponde con el carácter 𒈚 y nombre Cuneiform Sign Lugal Sheshig