Une image serveur minimale n'embarque souvent que la locale C. Tout fonctionne jusqu'à ce que le texte ne soit plus de l'anglais simple : l'arabe devient des points d'interrogation dans un journal, un nom de fichier accentué ne peut pas être créé, et le tri range les noms dans un ordre qu'aucun lecteur ne reconnaît.

Voir ce qui est défini

locale
locale -a | head

Si la liste ne contient que C et POSIX, aucune locale UTF-8 n'est générée sur la machine.

En générer une et la définir

sudo apt-get install -y locales
sudo locale-gen en_US.UTF-8 ar_EG.UTF-8
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

Déconnectez-vous puis reconnectez-vous. Les variables sont lues à la connexion : le shell depuis lequel vous les avez définies ne les affichera pas.

Les avertissements qui viennent de SSH

Les messages sur une locale impossible à définir signifient d'ordinaire que votre poste envoie sa propre locale à un serveur qui ne l'a pas. Soit vous générez cette locale sur le serveur, soit vous empêchez le client de l'envoyer.

# on your machine, ~/.ssh/config
Host *
    SendEnv -LANG -LC_*

La base de données est une autre question

La locale du serveur ne change rien à ce que MySQL enregistre. Une colonne déclarée latin1 abîme l'arabe et les emojis quel que soit le réglage du système — c'est traité dans Jeu de caractères, collation et le piège des emojis.

Changer la locale change la façon dont certains programmes trient. Si un script dépend de l'ordre de tri — une rotation de sauvegardes, un rapport —, vérifiez-le une fois après le changement plutôt que de le supposer.