Назад | Перейти на главную страницу

Что именно установка локали делает с системой?

У меня есть сервер Ubuntu 18.04 и с конфигурацией по умолчанию при вызове $ls команда для файла с латышским символом в имени (test_ā.txt) вывод содержит "test_??.txt"вместо символа Юникода.

Итак, на выходе $ locale команда такая:

$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=lv_LV.UTF-8
LC_TIME=lv_LV.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=lv_LV.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=lv_LV.UTF-8
LC_NAME=lv_LV.UTF-8
LC_ADDRESS=lv_LV.UTF-8
LC_TELEPHONE=lv_LV.UTF-8
LC_MEASUREMENT=lv_LV.UTF-8
LC_IDENTIFICATION=lv_LV.UTF-8
LC_ALL=

А вот список доступных локалей:

$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

Добавление новой локали устранило проблему отображения имени файла, а также предупреждение «Не удается установить LC_ALL»:

$ locale-gen lv_LV.UTF-8
Generating locales (this might take a while)...
  lv_LV.UTF-8... done
Generation complete.

Имя файла теперь отображается правильно: test_ā.txt. Теперь вывод команды locale

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=lv_LV.UTF-8
LC_TIME=lv_LV.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=lv_LV.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=lv_LV.UTF-8
LC_NAME=lv_LV.UTF-8
LC_ADDRESS=lv_LV.UTF-8
LC_TELEPHONE=lv_LV.UTF-8
LC_MEASUREMENT=lv_LV.UTF-8
LC_IDENTIFICATION=lv_LV.UTF-8
LC_ALL=

Итак, что конкретно решило проблему отображения имени файла? В конце концов, это всего лишь символ юникода в имени файла. Добавил бы любой .UTF8 локаль исправил бы это? Но en_US.UTF-8 язык уже был там, и LANG=en_US.UTF-8 настройка не изменилась. Если я сейчас добавлю новый файл с китайскими иероглифами, он также будет отображаться правильно:

$ touch test_你好世界.txt
$ ls test*
test_ā.txt  test_你好世界.txt

Итак, если en_US.UTF-8 является локалью UTF-8, почему символы Unicode не отображались должным образом до того, как я добавил lv_LV.UTF-8 локаль?