-bash:警告:setlocale:LC_ALL:无法更改区域设置(en_us.utf-8)

Ger*_* Me 5 macos bash utf-8

将 Mac 从 Sierra 升级到 High Sierra 后,当我使用终端 SSH 连接到 Centos(6 和 7)时,收到 setlocale 警告。

认为有一些解决方法可以解决这些问题,我发现问题是 locale 环境变量.bash_profile都是小写的en_us.utf-8。更改它以en_US.UTF-8 解决问题。

我尝试过的其他解决方案,在互联网上找到的是:

在 CentOS(服务器)中

  • 设置LC_LANG=en_US.utf8修复/etc/environments问题。

在 Mac(客户端)中

  • 删除 ssh_config 中的 SendEnv LC 修复问题

如果我运行locale -a,区域设置是

en_US.utf8在 CentOS 和

en_US_UTF-8在 MacOS 上

CentOS 和 MacOS 中语言环境变量的规范化过程似乎有所不同。在 CentOS 上,它似乎标准化UTF-8为小写并会删除连字符,但en_US在这种情况下需要。在 MacOS 上,它似乎标准化为大写并且需要连字符并接受 的任何大小写混合en_US。因此,兼容的设置是en_US.UTF-8三个字母UTF在任何情况下都可以出现的位置。

(这就是为什么我无法通过在 Mac 中将区域设置变量设置为 来解决问题en_US.utf8,它会将 更改LC_ALL为空白。)

那么标准的标准化程序是什么呢?或者有一个标准吗?

我不明白的另一件事是为什么只有在我升级到 High Sierra 后才发生这种情况。我发现我的.bash_profile设置正在使用en_us.utf-8,为什么我没有早点收到警告消息?两种可能的猜测是

  • High Sirrea 在升级后更改了 ssh_config(通过添加 SendEnv),或者

  • Sierra 在终端中标准化 LC_ALL 环境变量。

Gia*_*zzi 0

对于语言部分,有一种标准化:BCP47(https://www.rfc-editor.org/rfc/rfc5646)。这表示语言标识符与大小写无关,但最好遵循 RFC 中描述的标准大小写(语言小写,国家/地区大写,脚本的首字母大写)。Java引用了这样的语言环境设置标准:http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html#util-text(但只是语言标识符,没有编码)。JavaScript 类似(但它用后缀扩展区域设置-u-xxxx)。(C 和 Python 只是与系统区域设置交互)。

POSIX ( http://pubs.opengroup.org/onlinepubs/9699919799/functions/setlocale.html ) 是这样说的The contents of this string are implementation-defined。LSB 仅指 POSIX 和 ISO 上关于非冲突名称的讨论(无链接):https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/localization.html

维基百科列出了 POSIX 的另一个 ISO 标准,但当前的 POSIX 中并未引用该标准,并且该标准注册只有少数北欧国家。

所以,据我所知,没有标准化。语言标记标识符是标准化的((点)之前的部分.,但没有说明区域设置标识符的语言部分应该遵循它。