无法在 16.04 服务器上永久更改区域设置

Mec*_*MK1 9 server locale 16.04

我已经设置了一个全新的 Ubuntu 16.04 服务器,但是当我尝试永久更改语言环境设置时,它失败并恢复为 POSIX 语言环境。

键入会locale产生以下结果:

LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着根本没有设置语言环境,因为文档指出 POSIX 是“后备、ASCII 编码,与 C 相同”。

为了确保语言环境de_AT.utf8en_US.utf8存在我的系统上,我跑了locale -a,这产生了:

C
C.UTF-8
POSIX
de_AT.utf8
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
Run Code Online (Sandbox Code Playgroud)

请注意与 的不一致C.UTF-8,但是de_AT.utf8更让我担心的是 POSIX 是第三个条目,而在不同的工作系统上,它是列表的最后一个。

为了将我的语言更改为en_US.utf8,我输入了sudo update-locale LANG=en_US.utf8。该locale命令仍显示 POSIX 语言环境。注销并重新登录后,locale仍显示 POSIX 语言环境。重新启动后,locale仍然显示 POSIX 语言环境。

但是,当我输入 时export LANG=en_US.utf8,它会暂时工作,但仅在注销之前有效。因此,我非常确定语言环境是正确生成的。

我没有想法。我尝试重新生成所有语言环境,但看起来好像/etc/default/locale只是被忽略了。

为了完成起见,/etc/default/locale只包含该行LANG=en_US.utf8

UPDATE://我尝试运行sudo localectl set-locale LANG=en_US.UTF-8,并且localectl还向我展示了它设置了语言环境,但即使在重新启动后,locale仍然显示 POSIX 和非 ASCII 字符仍未正确呈现。

Ale*_*vić 10

我最终做的是上述技术的组合

我先做了

dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

并选择了英语,utf8,然后:

localedef -i en_US -c -f UTF-8 en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

还编辑了 /etc/default/locale 看起来像:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

重新启动后,当我输入locale 时,它现在看起来像这样:

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

并且没有更多的警告...


Mec*_*MK1 8

正如 Gunnar Hjalmarsson 在评论中提到的那样,答案确实与 PAM 相关。PAM 被禁用了sshd_config,虽然老实说我自己不记得这样做了。

总结:如果/etc/default/locale似乎被忽略,请检查是否启用了 PAM。


Vid*_*uth 6

运行以下命令:

locale-gen en_US.UTF-8
dpkg-reconfigure locale
dpkg-reconfigure keyboard-configuration
localedef -i en_US -c -f UTF-8 en_US.UTF-8
reboot
locale
Run Code Online (Sandbox Code Playgroud)