这似乎是一个很奇怪的问题,并且引起了我的胃灼热,因为我正在使用一个存储当前语言环境的库,并尝试将其设置回隐藏的位置。
$ 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
,这对我来说似乎很奇怪。
有人在这里有任何指导吗?
非常感谢!
答案 0 :(得分:1)
对于第一部分:有关系吗?据我所知,在您致电setlocale()
之前,我看不到任何区别,因此我们在第二部分:
您应该使用:
import locale
curr = locale.getdefaultlocale()
locale.setlocale(locale.LC_ALL, curr)
所以getdefaultlocale()
而不仅仅是getlocale()
。我也不太了解同时拥有这两个原因的原因。可能是Python错误无法识别C.xxx
。
答案 1 :(得分:0)
C.UTF-8的意图很好,但实现尚不完善。现在请避免直到稳定为止。
围绕redhat的讨论。这意味着它还不存在(至少在撰写本文时)。特别要注意的是,核心的python-dev Nick Coghlan建议python在诸如此类的某些上下文中无法正确获得语言环境。
haskell的讨论表明,便携式跨平台的东西(在这种情况下为haskell-stack,但也暗示为docker)随着C.UTF-8的使用变得越来越困难和不可靠。
Debian(also)启动了C.UTF-8,意图是正确的。
当今的Linux系统已进行了高度本地化-各种语言环境,LC_ *选择的细粒度选择等。但是默认情况下,所有这些功能都不启用:如果语言环境系统已损坏,则系统已损坏。损坏的语言环境系统不如损坏的内核,fstab或grub等那么剧烈的原因是...
如果发生其他情况,保证C locale(同义词POSIX)始终可以作为备用。因此,例如,您不会看到本地化的错误,但会看到英语-不会出现mojibake或空矩形或问号!
总的来说,您会得到这类warnings 不是错误,否则一切都会继续进行。
但是C = POSIX表示旧版ASCII不是UTF-8 everywhere,这是旧版的不良副作用。
为了使遗留物变得越来越少,甚至作为备用,Debian引入了始终可用的C.UTF-8语言环境。
抓住了吗?一直可用...
这意味着 recent Debian,Ubuntu之类的衍生产品也在最近出现。但是还没有(其他)系统。
简而言之,C.UTF-8并不是通用的,不是便携式的,易碎的,因此是可以避免的……至少目前,至少在客户端服务器,虚拟化(容器化)等系统(例如docker)上。 ....
您需要明确安装像en_US.UTF-8这样的老式语言环境。 (希望使用合理的国际英语语言环境而不希望使用en_US的人们不妨查看en_DK.UTF-8)。
是的,涉及一些
这里是面向docker的语言环境设置的引用的集合
我不同意上面重复的一种反模式,但 (从这个问题出发)太过遥远,无法对此进行扩展,所以在v short中:
设置语言环境通常应该仅涉及设置LANG
。设置LC_ALL
尤其是与LANG
一起使用是不可以的。
⚠️警告
强烈建议不要使用LC_ALL,因为它会覆盖所有内容。请仅在测试时使用它,切勿在启动文件中设置它。