Guía de locale en Ubuntu: idioma, UTF-8 y codificación de archivos

Written by

in

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:

VariableQué controla
LANGValor por defecto para todas las categorías no especificadas individualmente
LC_CTYPECodificación de caracteres y clasificación (mayúsculas/minúsculas, qué es una letra)
LC_TIMEFormato de fecha y hora
LC_NUMERICFormato de números (separador decimal, de miles)
LC_MONETARYFormato de moneda
LC_COLLATECriterio de ordenamiento alfabético
LC_MESSAGESIdioma 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.txt

Este 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.txt

Revela 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

locale

Muestra 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.txt

iconv 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.gen

Es 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-8

locale-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-8

La 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 locales

Abre 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-configuration

A 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

ArchivoAlcance
/etc/default/localeConfiguración global del sistema (todos los usuarios)
~/.bash_profileConfiguració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-8

7. 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 reboot

Resumen del flujo de diagnóstico

  1. Ejecutar locale — si algo aparece vacío o en C/POSIX, el sistema no tiene un locale regional configurado.
  2. Ejecutar file archivo.txt sobre el archivo problemático — si no está en UTF-8, el problema es del archivo, no del sistema.
  3. Si es el sistema: generar el locale con locale-gen, luego fijarlo con update-locale o localectl, y reiniciar sesión.
  4. Si es el archivo: convertirlo puntualmente con iconv, sin tocar la configuración del sistema.