Mengapa hampir setiap program mengeluh tentang lokal saya?

29

Saya menggunakan Arch Linux, dan saya telah mengikuti petunjuk di wiki tentang pengaturan lokal saya.

Hampir setiap program yang berjalan mengeluhkan lokal - bahkan locale. Ini terlihat seperti ini:

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

atau:

% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "en-US",
    LC_NUMERIC = "en-US",
    LC_MONETARY = "en-US",
    LC_MEASUREMENT = "en-US",
    LC_CTYPE = "en_US.UTF-8",
    LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")

Sesuatu yang sedikit membingungkan adalah bahwa /etc/locale.genada beberapa contoh; semua baris UTF-8 memiliki "sesuatu.UTF-8", dan menjalankan locale-genpertunjukan en_US.UTF-8... donesaat sedang berjalan, tetapi locale -a, yang seharusnya menunjukkan kepada Anda pertunjukan lokal yang tersedia en_US.utf8. Saya sudah mencoba berbagai kombinasi kedua format di /etc/locale-gendan LOCALE=di /etc/rc.conf, tetapi tidak ada yang memperbaiki masalah.

Informasi tambahan:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

Saran Bruce Ediger tentang pengaturan LANG=Cdan LC_ALL=en_US.UTF-8bekerja (pada kenyataannya, pengaturan LC_ALLmemperbaikinya, pengaturan LANGtidak penting), tetapi saya ingin tahu apa yang terjadi. Menurut SUS , LC_ALL akan menimpa semua variabel LC_ * lainnya jika disetel dan bukan nol. Dalam sistem saya, sudah diatur, tetapi itu adalah nol, jadi itu harus diabaikan, dan nilai-nilai lain harus digunakan sebagai gantinya. Itu tidak apa yang terjadi, tampaknya aplikasi panggil setlocaledengan LC_ALL, mendapatkan NULLkembali, dan menghasilkan kesalahan, bahkan ketika panggilan lain untuk setlocalekembali string yang baik.

Berikut adalah atas sebuah ltracedari locale(gulir kanan untuk melihat nilai-nilai fungsi kembali)

% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510)                                                                      = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "")                                                                                   = "en_US.UTF-8"
setlocale(5, "")                                                                                   = "en_US.UTF-8"
textdomain("libc")                                                                                 = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4)                                         = 0
setlocale(6, "")                                                                                   = NULL
dcgettext(0, 0x405aa8, 5, 0, 0)                                                                    = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)  
Shawn J. Goff
sumber
dapatkah Anda membagikan hasilnya locale -a?
njsg
Aku akan ke titik bahwa Anda harus menggunakan .utf8di LOCALEdan LC_*, tapi rupanya .UTF-8bekerja di sini juga ... Adapun en-US: tidak tampak (tanpa .utf8) di locale -a?
njsg
1
Lakukan export LANG=Cdan export LC_ALL=en_US.UTF-8dan lihat apa yang terjadi. Laptop Linux Arch saya memiliki LOCALE="en_US.UTF-8"/etc/rc.conf, dan saya tidak tahu di mana laptop saya mengatur LANG = C.
Bruce Ediger
Bisakah Anda memposting konten Anda /etc/locale.conf? Sepertinya Anda tidak sengaja menulis LANG=en-US(dengan tanda hubung) alih-alih LANG=en_US(dengan garis bawah).
Mikel
Dan isinya /etc/locale.genakan bermanfaat juga.
Mikel

Jawaban:

18

Anda kehilangan file yang akan digunakan untuk default lokal jika tidak ada $LANGatau $LC_ALL(atau semua yang lebih spesifik $LC_whatever) yang ditetapkan.

Pada glibc yang lebih lama, ini adalah / usr / lib / locale / locale-arsip. Karena GNU / Linux kacau, Anda harus menggunakan strace untuk menentukan file mana yang diharapkan dalam versi tertentu yang digunakan pada mesin Anda:

strace -e file locale
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
akses ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Tidak ada file atau direktori seperti itu)
open ("/ etc / ld.so.cache", O_RDONLY) = 3
open ("/ lib / libc.so.6", O_RDONLY) = 3
open ("/ usr / lib / locale / locale-archive", O_RDONLY | O_LARGEFILE) = 3

---------------------- Komentar ditambahkan 1 hari kemudian:

"ltrace -S" harusnya oke, karena ini menunjukkan syscalls.

Kalau tidak, "ltrace" tidak terlalu membantu (yaitu kontra-produktif versus strace), karena hanya menunjukkan panggilan teratas. Itu jelas (setlocale (3)), sedangkan masalah sebenarnya terjadi dalam libc.

Kedengarannya seperti Anda memiliki baku data lokal diinstal, karena en_US.UTF-8 karya.

Jika demikian, maka sesuatu seperti ini akan memperbaiki masalah Anda, menetapkan standar seluruh sistem:

localedef -f UTF-8 -i en_US en_US.UTF-8
AR
sumber
sudo localedef -f UTF-8 -i en_US en_US.UTF-8bekerja pada Raspbian 2018-11-13 Lite.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
6

Saya memiliki masalah yang sama setelah menyiapkan /etc/locale.confhanya hari ini (terkait dengan perubahan terbaru untuk /etc/rc.conf. Dalam kasus saya, ternyata lokal tidak diinstal.

Periksa /etc/locale.gen. Semua lokal tempat referensi variabel lingkungan Anda harus diaktifkan (yaitu tidak dikomentari) di sana. Setelah melakukan perubahan, jalankan sudo locale-genuntuk menginstal lokal yang dipilih.

Stefan Majewsky
sumber
2

Mengikuti tautan ini menyelesaikan masalah saya:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

ini menghasilkan file /etc/locale.confyang memperbaiki masalah ini

Kokizzu
sumber
1

Saya memiliki masalah yang sama baru-baru ini, semua nama file unicode tidak ditampilkan dengan benar, ketika saya tidak sengaja menghapus 'LOCALE = en_US.utf8' di /etc/rc.conf. Jadi saya memeriksa skrip boot:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

Solusi sederhana adalah memeriksa keduanya DAEMON_LOCALEdan LOCALEmasuk /etc/rc.conf, pastikan yang pertama tidak nodan yang kedua tidak kosong.

bunga aster
sumber
-1

Mungkin salah satu pengaturan Anda tidak valid? Ini adalah pengaturan lokal saya untuk referensi; mereka tidak menyebabkan kesalahan (KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=
dwurf
sumber