1. Introducción
Imagínate que eres un diplomático en una cumbre internacional: cada uno habla su idioma y usa su propia escritura. Para entenderse hace falta un traductor universal —un conjunto común de reglas que emparejen los símbolos. En los ordenadores ese papel lo desempeñan las codificaciones.
El ordenador solo entiende un "lenguaje": secuencias de ceros y unos. 0 y 1 son su "alfabeto". Toda la información se guarda y transmite en forma de bytes. Un byte son 8 bits (por ejemplo, 01000001).
¿Cómo enlazar nuestras letras y signos con bytes? ¿Cómo sabe el ordenador que la letra "A" no es simplemente un conjunto de 0/1, sino ese símbolo que aparece en pantalla?
Codificación
Una codificación es un conjunto de reglas (una tabla de correspondencias) que define cómo cada carácter (letra, número, signo, ideograma, emoji) se transforma en una secuencia de bytes y cómo esos bytes se interpretan de nuevo como caracteres.
Analogía: el código Morse: conviertes texto en puntos y rayas, transmites el mensaje y el receptor, usando las mismas reglas, reconstruye los símbolos. En el ordenador, el convenio "bytes ↔ caracteres" es la codificación.
2. ¿Por qué necesitamos este dolor de cabeza con las codificaciones?
- Puente entre humanos y máquinas: sin codificación el texto es solo un conjunto de bytes; con codificación son caracteres con sentido.
- Universalidad y compatibilidad: diferentes programas y SO deben "ponerse de acuerdo" sobre las reglas. Si un archivo declara UTF-8, hay que leerlo como UTF-8.
- Soporte para muchos idiomas y símbolos: cirílico, escritura árabe, ideogramas, símbolos matemáticos, emojis — cuanto más amplio es el conjunto de caracteres, más compleja y flexible debe ser la codificación.
3. ASCII — la codificación "primitiva"
Una de las codificaciones más antiguas y básicas es ASCII (American Standard Code for Information Interchange). Usa 7 bits por carácter, es decir puede representar 128 símbolos distintos: el alfabeto latino (A-Z, a-z), dígitos (0-9), signos de puntuación y códigos de control (por ejemplo, salto de línea, tabulación).
| Carácter | Código decimal (ASCII) | Código binario (7 bits) |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Espacio | |
|
Históricamente el octavo bit se usaba a menudo para el bit de paridad, y luego se empezó a usar para "extensiones" de ASCII — así surgieron diferentes conjuntos de un byte para locales, lo que llevó a inconsistencia.
Si escribes "Hello", en disco será algo así (1 byte por carácter; para el ASCII de 7 bits el bit más alto es cero):
H (01001000) e (01100101) l (01101100) l (01101100) o (01101111)
Sencillo. ¿Y las letras rusas o los ideogramas? En ASCII no están — es un "diccionario monolingüe", útil solo para el conjunto latino básico.
4. "Mojibake" — por qué la codificación no es una broma
A veces, al abrir un archivo, ves algo como Привет en vez de "Privet". Esto se llama "mojibake" (o caracteres corruptos) — el resultado de leer bytes con la codificación equivocada.
Supongamos que guardaste "Privet, mir!" en la codificación Windows-1251, donde los bytes para las letras de "Privet" pueden ser algo así (simplificado):
- P → 207
- r → 240
- i → 232
- v → 226
- e → 229
- t → 242
Luego tu colega abrió el archivo en un editor que esperaba ISO-8859-1 (Latin-1), o usaste StreamReader sin especificar la codificación, y no coincidió con la del archivo. Resultado: el byte 207 se interpreta como un carácter de otra tabla — y el texto "se rompe".
| Símbolo original (Windows-1251) | Representación en bytes (ejemplo) | Carácter leído como ISO-8859-1 |
|---|---|---|
| P | |
Ç |
| r | |
à |
| i | |
è |
| v | |
â |
| e | |
å |
| t | |
ò |
Al final obtenemos Çàèâåò en lugar de "Privet". Si un carácter directamente no existe en la codificación esperada, verás cuadros o signos de interrogación.
Conclusión práctica: al leer/escribir textos es importante especificar explícitamente la codificación, especialmente si la fuente de datos no está bajo tu control. En .NET se hace mediante StreamReader/StreamWriter con la Encoding adecuada (por ejemplo, UTF-8 o Encoding.GetEncoding("windows-1251")). Esto ayuda a evitar mojibake y asegura un intercambio de datos correcto entre sistemas.
En las siguientes lecciones aprenderemos a elegir y especificar la codificación al trabajar con archivos y streams, para que tu código sea universal, internacional y fiable.
GO TO FULL VERSION