En informática existen muchas maneras diferentes de representar texto, de modo que pueda representar diversos conjuntos de caracteres, ideogramas y símbolos.
Al principio todo era muy sencillo, pero poco útil. Los estadounidenses desarrollaron la informática y, como no, la hicieron totalmente "anglocéntrica" desarrollando el conjunto de caracteres ASCII (American Standard Code for Information Interchange). ASCII era capaz de representar 128 caracteres diferentes del alfabeto anglosajón. Por lo tanto no había ni tildes, ni "eñes" ni por supuesto caracteres cirílicos, ideogramas japoneses, etc...
En la actualidad existen infinidad de maneras de codificar los caracteres para almacenarlos, transmitirlos y mostrarlos en un sistema informático. El más común y utilizado en el mundo es UTF-8 (Unicode transformation Format-8). UTF-8 es capaz de codificar millones de caracteres diferentes y dispone de todos los símbolos usados en lenguajes humanos, además de otro tipo de representaciones (como emoticonos).
Existen, sin embargo, otros muchos métodos de codificación de textos: ANSI, otras variantes de UTF con ciertas ventajas (UTF-16 o 32), e incluso dentro de cada sistema operativo hay diferentes codificaciones de texto (o code pages) para representar conjuntos de caracteres (por ejemplo, Windows-1252 representa caracteres occidentales, y es equivalente a ANSI).
En las páginas web debemos indicar el tipo de codificación que se ha utilizado para crearlas usando una cabecera <meta> en el documento, por ejemplo:
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mi página</title>
</head>
<body>
</body>
</html>
En este caso indicamos que la página se ha codificado usando UTF-8, algo que a día de hoy es lo que hacen el 85% de las páginas (cuando veas este enlace seguramente muchos más).
Pero ¿qué pasa si en el contenido de la página indicamos una codificación pero el archivo realmente está codificado de otra manera? ¿Y si es el servidor el que difiere e indica un tipo de codificación diferente al enviar la página a través de HTTP?
Pues pasan cosas como esta:
Dado que puede haber discrepancia en tres datos diferentes, en estos casos ¿qué codificación es la buena?, ¿a cuál hace caso el navegador?.
Pues el estándar indica que la precedencia es la siguiente:
- Lo que indique el servidor.
- El BOM o Byte Order Mark del archivo (que no todos lo tienen). Son unos caracteres al principio que sirven únicamente para identificar la codificación utilizada en el mismo.
- La cabecera <meta> del documento.
Es decir, que realmente lo que menos influye es la cabecera <meta> obligatoria que debemos meter en las páginas HTML5.
En realidad no sería necesario incluir la etiqueta <meta> para indicar la codificación ya que lo suele indicar el servidor directamente. Lo que ocurre es que la especificación indica que debemos indicarlo obligatoriamente con la etiqueta <meta> porque el servidor no tiene porqué indicarlo, aunque lo hagan la práctica totalidad de ellos hoy en día.
Lo que importa de verdad es que la codificación indicada en el archivo y la real deben coincidir o se verán cosas raras cuando lo coloques un servidor web.
En resumen: si no indicas la codificación en la página no pasa nada, pero realmente no estarías haciendo lo que manda HTML5. Lo habitual y recomendable es que se indique (puedes verlo en casi cualquier página), pero sobre todo que la codificación indicada y la real con la que se ha guardado el archivo coincidan.