Un problema muy común en Linux: los acentos y caracteres especiales (ñ, á, é, etc.) aparecen rotos o como símbolos extraños. Casi siempre se debe a una de dos causas: un archivo con codificación incorrecta (no UTF-8), o el locale del sistema mal configurado. Esta guía cubre el diagnóstico y la corrección de ambos casos en Ubuntu 24.04.
¿Qué es el locale?
El locale define el conjunto de convenciones regionales que usa el sistema: idioma de los mensajes, formato de fecha y hora, símbolo de moneda, criterio de ordenamiento alfabético, y — lo más relevante para este problema — la codificación de caracteres que el sistema espera usar (UTF-8, ISO-8859-1, etc.).
El locale no es una sola variable, sino varias categorías LC_* independientes, que en conjunto forman la configuración regional completa:
| Variable | Qué controla |
|---|---|
LANG | Valor por defecto para todas las categorías no especificadas individualmente |
LC_CTYPE | Codificación de caracteres y clasificación (mayúsculas/minúsculas, qué es una letra) |
LC_TIME | Formato de fecha y hora |
LC_NUMERIC | Formato de números (separador decimal, de miles) |
LC_MONETARY | Formato de moneda |
LC_COLLATE | Criterio de ordenamiento alfabético |
LC_MESSAGES | Idioma de los mensajes del sistema y aplicaciones |
Cuando los acentos se ven mal, la variable más relevante es LC_CTYPE (heredada de LANG si no se define aparte), ya que es la que determina qué codificación de caracteres usa el sistema para interpretar el texto.
Diagnóstico
1. Verificar la codificación del archivo
file archivo.txtEste comando detecta y muestra la codificación real del archivo (por ejemplo, UTF-8 Unicode text o ISO-8859 text). Si el archivo no está en UTF-8 y el sistema sí lo está, ahí está el origen del problema — no es un problema del sistema, sino del archivo en sí.
2. Mostrar caracteres invisibles
cat -v archivo.txtRevela caracteres de control y bytes no imprimibles que normalmente quedan ocultos en una vista normal del archivo — útil para detectar bytes corruptos o secuencias de escape mal interpretadas.
3. Ver la configuración regional actual
localeMuestra el valor actual de todas las variables LC_* y LANG en la sesión activa. Si alguna aparece vacía o como C/POSIX (el locale mínimo sin soporte real de idioma ni UTF-8), esa es la señal de que el sistema no tiene un locale regional configurado correctamente.
4. Convertir un archivo a UTF-8
iconv -f ISO-8859-1 -t UTF-8 archivo_origen.txt -o archivo_utf8.txticonv convierte la codificación de un archivo sin alterar su contenido textual — solo reinterpreta los bytes según la codificación de origen (-f) y los reescribe en la codificación destino (-t). Es la solución cuando el problema es del archivo específico, no del sistema completo.
Trabajar con locale en Ubuntu 24.04
1. Ver locales instalados y disponibles
# Variables activas en la sesión actual
locale
# Todos los locales ya generados/disponibles en el sistema
locale -a
# Locales listados para generación en /etc/locale.gen
cat /etc/locale.genEs importante distinguir estos tres: locale muestra lo que está activo ahora, locale -a muestra lo que está generado y disponible para usar, y /etc/locale.gen es la lista de configuración de qué se debe generar — un locale puede estar en este archivo pero no haber sido generado aún.
2. Generar un locale (si no existe)
# Español de España, UTF-8
sudo locale-gen es_ES.UTF-8
# Español de México, UTF-8
sudo locale-gen es_MX.UTF-8locale-gen compila el locale a partir de sus datos fuente y lo deja disponible para el sistema — es un paso previo obligatorio antes de poder usarlo como LANG o cualquier otra variable LC_*.
3. Establecer el locale del sistema
# Establecer LANG global (método clásico)
sudo update-locale LANG=es_ES.UTF-8
# Alternativa moderna usando localectl (integrado con systemd)
sudo localectl set-locale LANG=es_ES.UTF-8
# Establecer un parámetro específico, sin afectar los demás
sudo update-locale LC_TIME=es_ES.UTF-8La diferencia entre update-locale y localectl: ambos terminan escribiendo en el mismo archivo de configuración (/etc/default/locale), pero localectl es la herramienta moderna que forma parte del ecosistema systemd (junto con timedatectl y hostnamectl), y valida que el locale exista antes de aplicarlo — update-locale es más directo pero no hace esa validación previa.
4. Reconfigurar locales con interfaz interactiva
sudo dpkg-reconfigure localesAbre un asistente interactivo (interfaz de texto tipo ncurses) donde se puede: seleccionar qué locales generar de una lista completa, y elegir cuál queda como el locale por defecto del sistema. Es la forma más segura para quienes prefieren no editar archivos de configuración a mano.
5. Configurar teclado (si afecta a los acentos)
sudo dpkg-reconfigure keyboard-configurationA veces el problema no es el locale del sistema sino la distribución de teclado configurada — si las teclas de acentos y ñ no producen el carácter esperado al escribir directamente en la terminal, este es el comando a revisar.
6. Archivos donde se guarda la configuración
| Archivo | Alcance |
|---|---|
/etc/default/locale | Configuración global del sistema (todos los usuarios) |
~/.bash_profile | Configuración específica de un usuario, sobreescribe la global en su sesión |
Ejemplo para fijar el locale de un usuario específico, sin afectar al resto del sistema:
echo 'LANG=es_ES.UTF-8' >> ~/.bash_profile
export LANG=es_ES.UTF-87. Aplicar los cambios
Los cambios de locale a nivel de sistema generalmente requieren cerrar sesión y volver a entrar, o en algunos casos un reinicio completo para que todos los servicios y procesos existentes tomen la nueva configuración:
sudo rebootResumen del flujo de diagnóstico
- Ejecutar
locale— si algo aparece vacío o enC/POSIX, el sistema no tiene un locale regional configurado. - Ejecutar
file archivo.txtsobre el archivo problemático — si no está en UTF-8, el problema es del archivo, no del sistema. - Si es el sistema: generar el locale con
locale-gen, luego fijarlo conupdate-localeolocalectl, y reiniciar sesión. - Si es el archivo: convertirlo puntualmente con
iconv, sin tocar la configuración del sistema.