Codificación de caracteres
Desarrollo de Aplicaciones en Internet
Codificación de caracteres
Desarrollo de Aplicaciones en Internet
Introducción
- Los caracteres tanto en memoria como en otros dispositivos de almacenamiento se representan como secuencias de bits
- Un fichero de texto con una sola letra ‘a’ ocupa 1 byte
- Si el fichero es binario (documento de un procesador de textos, por ejemplo) puede ocupar mucho más
US-ASCII
- El estándar US-ASCII (también conocido como ASCII, American Standard Code for Information Interchange) representa cada carácter con 7 bits
- Su origen se remota a la década de 1960
- Se decidió usar 7 bits porque eran suficientes para representar los 128 caracteres deseados y también para reducir el coste de la transmisión
- En la práctica se usan 8 bits para que coincida con un byte
ISO/IEC 8859
- Una serie de estándares de codificación de caracteres de 8 bits (256 caracteres diferentes)
- 15 codificaciones de caracteres para diferentes lenguajes
- Los 128 primeros caracteres (0-127) son compatibles con US-ASCII
ISO/IEC 8859
- Si no permitimos el cambio de la codificación de caracteres en mitad de un documento, no es posible mezclar textos en español y ruso, por ejemplo
- En el caso de ficheros de texto, como estos no contienen la codificación que usan, es necesario indicarla explícitamente al programa con el que vayamos a visualizarlos o editarlos
ISO/IEC 8859-1 (Latin 1)
- Inglés, islandés, español, francés, catalán…
ISO/IEC 8859-15
- Añade a ISO/IEC 8859-1 el símbolo del euro y algún otro como la ligadura ‘œ’ del francés (con ISO/IEC 8859-1 se escriben como ‘oe’)
ISO/IEC 8859-2
- Bosnio, croata, checo, eslovaco, húngaro, serbio…
ISO/IEC 8859-5
- Ruso, bielorruso, macedonio, serbio, búlgaro…
Otras codificaciones
- Algunos sistemas operativos incluían codificaciones alternativas (Windows-1252, por ejemplo)
Unicode
- Estándar del Unicode Consortium que intenta reemplazar a todos los anteriores y permite entornos plurilingües
- Cada carácter se identifica mediante un número o punto de código
- Los puntos de código no cambian, pero hay diferentes codificaciones: UTF-8, UTF-16, UTF-32, etc.
Unicode
- El estándar Unicode permite 1.114.112 puntos de código
- Actualmente están asignados unos 140.000, incluyendo emojis (‘🥘’, U+1F958), caracteres de alfabetos antiguos, etc.
Codificaciones de caracteres de Unicode
- UTF-8 es la más usada en la web: 1 byte para los primeros 128 puntos de código (iguales a los de US-ASCII) y hasta 4 para los restantes
- UTF-16: 2 o 4 bytes por carácter
- UTF-32: 4 bytes por carácter
Cómo usar Unicode
- Usar un editor de texto que lo soporte (Unicode suele ser la codificación por defecto hoy en día)
- Usar un lenguaje de programación que lo soporte (muchos lo hacen de forma nativa)
- Usar un tipo de letra adecuado (ningún tipo de letra soporta todos los caracteres de Unicode)
Programar con caracteres de Unicode
var Omega = 'Ω';
var Omega = '\u03A9'; // compatible con cualquier entorno
public static void m (void) {
int ဆဆဆ = 100; // caracteres en birmano
System.out.println("ကောင်းသောနေ.ပါ " + ဆဆဆ);
}
Entidades de HTML
- En desuso
- Permiten representar algunos caracteres que no son US-ASCII dentro de un documento HTML
- El carácter ‘Ã’ se puede representar como uno de los siguientes:
Ã
Ã
Ã
Ejemplos
- El carácter ‘a’ (LATIN SMALL LETTER A, U+0061) en US-ASCII es 01100001 (61 en hexadecimal, x61), igual que en ISO/IEC 8859 y que en UTF-8; en UTF-16 es 11111110 11111111 00000000 01100001 (xFEFF0061)
- El carácter ‘á’ (LATIN SMALL LETTER A WITH ACUTE, U+00E1) se representa en ISO/IEC 8859-15 como xE1 y en UTF-8 como xC3A1
Ejemplos
- El carácter ‘Ã’ se representa en ISO/IEC 8859-15 como xC3
- El carácter ‘¡’ se representa en ISO/IEC 8859-15 como xA1
Problema
- Teniendo en cuenta los datos de las diapositivas anteriores, ¿cómo se ve un fichero de texto escrito en UTF-8 que contiene guaraná en un editor de texto configurado para ISO/IEC 8859-15?
- ¿Cómo se ve un fichero de texto escrito en ISO/IEC 8859-1 que contiene guaraná en un editor de texto configurado para UTF-8?
UTF-8 en páginas web
- Configurar el servidor para que informe al cliente de que la codificación es UTF-8: añadir a la petición y a la respuesta la cabecera HTTP:
Content-Type: text/html; charset=utf-8
- Indicar la codificación en el head de HTML:
<meta charset="utf-8">
o antiguamente:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Precacuciones
- En JavaScript, que usa UTF-16, “🤦🏻♂️”.length == 7 (man facepalming: light skin tone); el número de bytes en memoria es 14
- La cadena contiene 5 valores de Unicode (explicación): persona palmeándose la cara, color de piel, ligadura de códigos, hombre, no monocromo
- En otros lenguajes la longitud puede ser diferente, pero pocos lenguajes dan 1 como longitud