我已经设置了一个全新的 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=
据我所知,这意味着根本没有设置区域设置,因为文档指出 POSIX 是“后备,ASCII 编码,与 C 相同“。
为了确保语言环境de_AT.utf8
和en_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
请注意与的不一致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
更新://我尝试运行sudo localectl set-locale LANG=en_US.UTF-8
,并且localectl
还显示它设置了语言环境,但即使重新启动后,locale
仍然显示 POSIX 和非 ASCII 字符仍然无法正确呈现。
答案1
我最终做的是上述技术的组合
我已经做了
dpkg-reconfigure locales
并选择英语,utf8,然后:
localedef -i en_US -c -f UTF-8 en_US.UTF-8
也编辑 /etc/默认/区域设置 看起来像:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8
重启后,当我输入区域设置现在看起来像这样:
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
并且不再有警告...
答案2
答案确实与 PAM 有关,正如 Gunnar Hjalmarsson 在评论中提到的那样。PAM 是通过 禁用的sshd_config
,尽管说实话我不记得自己这样做过。
总结一下:如果/etc/default/locale
似乎被忽略,请检查 PAM 是否启用。
答案3
运行以下命令:
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
答案4
在部署一些新的 16.04.5 VM 时,我遇到了同样的问题,但使用的xrdp
是 SSH。我通过将以下内容添加到 来解决这个问题/etc/pam.d/common-session
:
session required pam_env.so readenv=1 user_readenv=1 envfile=/etc/default/locale
如果您对登录方法中的其他语言和文化很敏感,则可以将其放入/etc/pam.d/xrdp-sesman
(或另一个 PAM 配置文件)。这可能是它默认不存在的原因?在我们新的 VM 安装中,它默认位于以下 PAM 配置中:
cron、lightdm*、login、polkit-1、sshd、su 和 sudo。
希望这可以帮助遇到此问题的人使用除 SSH 之外的其他登录方法。
有人知道 PAM 配置/修改 common-* 的最佳实践吗?如果有更好的方法来实现这一点,那就最好把它记下来。