У меня есть сервер 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
локаль?