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.
