Python默认语言环境(不受支持的语言环境设置)

时间:2019-12-11 22:43:17

标签: python encoding utf-8 locale setlocale

这似乎是一个很奇怪的问题,并且引起了我的胃灼热,因为我正在使用一个存储当前语言环境的库,并尝试将其设置回隐藏的位置。

$ docker run --rm -it python:3.6 bash
root@bcee8785c2e1:/# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
root@bcee8785c2e1:/# locale -a
C
C.UTF-8
POSIX
root@bcee8785c2e1:/# python
Python 3.6.9 (default, Jul 13 2019, 14:51:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> curr = locale.getlocale()
>>> curr
('en_US', 'UTF-8')
>>> locale.setlocale(locale.LC_ALL, curr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/locale.py", line 598, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>>

我不确定为什么getlocale返回en_US吗?它不在我的环境var中的任何地方(而且我不确定它在我的shell中还有什么地方?)。

在任何情况下,我都无法使用setlocale中的值来getlocale,这对我来说似乎很奇怪。

有人在这里有任何指导吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

对于第一部分:有关系吗?据我所知,在您致电setlocale()之前,我看不到任何区别,因此我们在第二部分:

您应该使用:

import locale
curr = locale.getdefaultlocale()
locale.setlocale(locale.LC_ALL, curr)

所以getdefaultlocale()而不仅仅是getlocale()。我也不太了解同时拥有这两个原因的原因。可能是Python错误无法识别C.xxx

答案 1 :(得分:0)

C.UTF-8 —最近的非便携式debianism

C.UTF-8的意图很好,但实现尚不完善。现在请避免直到稳定为止。

有关上下文的一些讨论

围绕redhat的讨论。这意味着它还不存在(至少在撰写本文时)。特别要注意的是,核心的python-dev Nick Coghlan建议python在诸如此类的某些上下文中无法正确获得语言环境。

haskell的讨论表明,便携式跨平台的东西(在这种情况下为haskell-stack,但也暗示为docker)随着C.UTF-8的使用变得越来越困难和不可靠。

意图

Debianalso)启动了C.UTF-8,意图是正确的。

当今的Linux系统已进行了高度本地化-各种语言环境,LC_ *选择的细粒度选择等。但是默认情况下,所有这些功能都不启用:如果语言环境系统已损坏,则系统已损坏。损坏的语言环境系统不如损坏的内核,fstab或grub等那么剧烈的原因是...

C语言环境

如果发生其他情况,保证C locale(同义词POSIX)始终可以作为备用。因此,例如,您不会看到本地化的错误,但会看到英语-不会出现mojibake或空矩形或问号!

总的来说,您会得到这类warnings 不是错误,否则一切都会继续进行。

但是C = POSIX表示旧版ASCII不是UTF-8 everywhere,这是旧版的不良副作用。

为了使遗留物变得越来越少,甚至作为备用,Debian引入了始终可用的C.UTF-8语言环境。

抓住了吗?一直可用...

仅在Debian中

这意味着 recent Debian,Ubuntu之类的衍生产品也在最近出现。但是还没有(其他)系统。

简而言之,C.UTF-8并不是通用的,不是便携式的,易碎的,因此是可以避免的……至少目前,至少在客户端服务器,虚拟化(容器化)等系统(例如docker)上。 ....

实践成果

您需要明确安装像en_US.UTF-8这样的老式语言环境。 (希望使用合理的国际英语语言环境而不希望使用en_US的人们不妨查看en_DK.UTF-8)。

是的,涉及一些

弄脏你的手

这里是面向docker的语言环境设置的引用的集合

我不同意上面重复的一种反模式,但 (从这个问题出发)太过遥远,无法对此进行扩展,所以在v short中:

设置语言环境通常应该涉及设置LANG。设置LC_ALL尤其是与LANG一起使用是不可以的。

来自Debian wiki

⚠️警告

强烈建议不要使用LC_ALL,因为它会覆盖所有内容。请仅在测试时使用它,切勿在启动文件中设置它。