เหตุใดเกือบทุกโปรแกรมจึงบ่นเกี่ยวกับสถานที่ของฉัน


29

ฉันใช้ Arch Linux และฉันได้ปฏิบัติตามคำแนะนำในวิกิเกี่ยวกับการตั้งค่าภาษาของฉัน

เกือบโปรแกรมที่ทำงานทุกบ่นเกี่ยวกับสถานที่เกิดเหตุ - localeแม้ ดูเหมือนว่านี้:

% 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=

หรือ:

% 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")

สิ่งที่สับสนเล็กน้อยคือ/etc/locale.genมีหลายตัวอย่าง ทั้งหมด UTF-8 สายมี "something.UTF-8" และทำงานlocale-genแสดงให้เห็นว่าen_US.UTF-8... doneในขณะที่มันทำงาน แต่ที่ควรจะแสดงให้คุณเห็นสถานที่ที่มีอยู่แสดงให้เห็นว่าlocale -a en_US.utf8ฉันได้พยายามชุดต่างๆของรูปแบบทั้งใน/etc/locale-genและLOCALE=ใน/etc/rc.confแต่ไม่มีอะไรได้รับการแก้ไขปัญหาที่เกิดขึ้น

ข้อมูลเพิ่มเติม:

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

ข้อเสนอแนะของ Bruce Ediger เกี่ยวกับการตั้งค่าLANG=CและการLC_ALL=en_US.UTF-8ทำงาน (อันที่จริงการตั้งค่าLC_ALLแก้ไขการตั้งค่าLANGไม่สำคัญ) แต่ฉันต้องการทราบว่าเกิดอะไรขึ้น ตามSUS , LC_ALL จะแทนที่ตัวแปร LC_ * อื่น ๆ ทั้งหมดหากมีการตั้งค่าและไม่เป็นโมฆะ ในระบบของฉันมันถูกตั้งค่า แต่มันเป็นโมฆะดังนั้นจึงควรละเว้นและควรใช้ค่าอื่นแทน นั่นไม่ใช่สิ่งที่เกิดขึ้นมันก็ดูเหมือนว่าการใช้งานจะเรียกsetlocaleด้วยLC_ALL, การNULLกลับมาและสร้างข้อผิดพลาดแม้ในขณะที่สายอื่น ๆ ที่จะsetlocaleกลับมาเป็นสตริงที่ดี

นี่คือด้านบนของนั้นltraceของlocale(ขวาเลื่อนเพื่อดูค่าตอบแทนการทำงาน)

% 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)  

คุณสามารถแบ่งปันการส่งออกของlocale -a?
njsg

ฉันกำลังจะชี้ให้เห็นว่าคุณควรใช้.utf8ในLOCALEและLC_*ดูเหมือนจะ.UTF-8ทำงานที่นี่เช่นกัน ... สำหรับ en-US: มันปรากฏ (ไม่.utf8) ในlocale -aหรือไม่
njsg

1
ทำexport LANG=Cและexport LC_ALL=en_US.UTF-8ดูว่าเกิดอะไรขึ้น แล็ปท็อป Arch linux ของฉันมีLOCALE="en_US.UTF-8"/etc/rc.conf และฉันไม่สามารถทราบได้ว่าแล็ปท็อปของฉันตั้งค่า LANG = C ไว้ที่ใด
Bruce Ediger

คุณสามารถโพสต์เนื้อหาของคุณได้/etc/locale.confหรือไม่? ดูเหมือนว่าคุณเขียนLANG=en-USด้วยเครื่องหมายยัติภังค์LANG=en_US(โดยใช้เครื่องหมายขีดล่าง) โดยไม่ตั้งใจ
มิเคล

และเนื้อหาของ/etc/locale.genจะเป็นประโยชน์เช่นกัน
มิเคล

คำตอบ:


18

คุณไม่มีไฟล์ซึ่งจะใช้ในการเริ่มต้นสถานที่ในกรณีที่ไม่มี$LANGหรือ$LC_ALL(หรือทั้งหมดที่เฉพาะเจาะจงมากขึ้น$LC_whatever) การตั้งค่า

สำหรับ glibc รุ่นเก่าจะเป็น / usr / lib / locale / locale-archive เนื่องจาก GNU / Linux ไม่เป็นระเบียบคุณควรใช้ strace เพื่อพิจารณาว่าควรใช้ไฟล์ใดในรุ่นที่ใช้งานบนเครื่องของคุณ:

โลแคล ste -e file
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)
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

---------------------- ความคิดเห็นที่ถูกเพิ่ม 1 วันต่อมา:

"ltrace -S" ควรจะโอเคเพราะมันแสดงให้เห็นว่า syscalls

มิฉะนั้น "ltrace" ไม่เป็นประโยชน์มาก (เช่นมันต่อต้านและ strace) เพราะมันจะแสดงเฉพาะการโทรบนสุด สิ่งเหล่านี้ชัดเจน (setlocale (3)) ในขณะที่ปัญหาจริงเกิดขึ้นภายใน libc

ดูเหมือนว่าคุณได้ติดตั้งข้อมูลสถานที่แบบดิบเนื่องจาก en_US.UTF-8 ทำงาน

ถ้าเป็นเช่นนั้นสิ่งนี้ควรแก้ไขปัญหาของคุณโดยตั้งค่าเริ่มต้นทั้งระบบ:

localedef -f UTF-8 -i en_US en_US.UTF-8

sudo localedef -f UTF-8 -i en_US en_US.UTF-8ใช้งานได้กับ Raspbian 2018-11-13 Lite
Ciro Santilli 新疆改造中心法轮功六四事件

6

ฉันมีปัญหาเดียวกันหลังจากตั้งค่า/etc/locale.confวันนี้ (เกี่ยวข้องกับการเปลี่ยนแปลงล่าสุด/etc/rc.confในกรณีของฉันปรากฏว่าสถานที่ไม่ได้ติดตั้ง

/etc/locale.genตรวจสอบ โลแคลทั้งหมดที่การอ้างอิงตัวแปรสภาพแวดล้อมของคุณต้องถูกเปิดใช้งาน (เช่นไม่ได้ใส่ความคิดเห็น) ในนั้น หลังจากทำการเปลี่ยนแปลงแล้วให้เรียกใช้sudo locale-genเพื่อติดตั้งตำแหน่งที่เลือก


2

การใช้ลิงค์นี้เพื่อแก้ปัญหาของฉัน:

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

มันสร้างไฟล์/etc/locale.confที่แก้ไขปัญหานี้


1

ฉันมีปัญหาที่คล้ายกันเมื่อเร็ว ๆ นี้ชื่อไฟล์ unicode ทั้งหมดแสดงอย่างไม่ถูกต้องเมื่อฉันลบ 'LOCALE = en_US.utf8' /etc/rc.confโดยไม่ตั้งใจ ดังนั้นฉันจะตรวจสอบบูตสคริปต์:

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

วิธีแก้ไขปัญหาอย่างง่ายคือตรวจสอบทั้งในDAEMON_LOCALEและตรวจสอบให้แน่ใจว่าไม่ได้เป็นคนแรกและคนที่สองไม่ได้ว่างเปล่าLOCALE/etc/rc.confno


-1

บางทีการตั้งค่าของคุณอาจไม่ถูกต้อง นี่คือการตั้งค่าภาษาของฉันสำหรับการอ้างอิง พวกเขาไม่ก่อให้เกิดข้อผิดพลาดใด ๆ (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=
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.