为什么没有Encoding.default_external尊重LANG?

时间:2015-01-16 10:30:49

标签: ruby utf-8 character-encoding ascii

我的理解是,Ruby Encoding.default_external根据环境变量LC_ALLLANG获得默认值,优先于前者。我遇到了几个错误,即使环境变量设置为UTF-8,默认的外部编码也会以某种方式设置为ASCII。

例如:

$ irb
irb(main):001:0> Encoding.default_external
=> #<Encoding:US-ASCII>
irb(main):002:0> ENV['LC_ALL']
=> nil
irb(main):003:0> ENV['LANG']
=> "en_US.UTF-8"

在发生这种情况的环境中,我还通过手动设置默认外部编码的任何代码来加载所有加载的宝石,但却找不到任何内容。我上面看到的可能性如何?我上面使用的是Ruby 2.2,但我发现这种情况发生在所有Ruby 2.x版本上。

1 个答案:

答案 0 :(得分:4)

我明白了。不仅需要设置LANG环境变量,而且必须为操作系统生成它所属的区域设置。在库存Linux映像上,默认语言环境可能不是UTF-8。在我的特定情况下,我使用的是Debian 7.7,默认语言环境是&#34; POSIX&#34;。我可以通过安装locales包并按照交互式提示设置默认语言环境来生成en_US.UTF-8语言环境:

$ apt-get -y install locales

如果已经安装了语言环境包,您只需重新配置它:

$ dpkg-reconfigure locales

现在设置LANG将更改当前系统区域设置,并且Ruby Encoding.default_external将正确设置:

$ export LANG=en_US.UTF-8
$ locale
LANG=en_US.UTF-8
LANGUAGE=
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=
$ irb
irb(main):001:0> Encoding.default_external
=> #<Encoding:UTF-8>

有关如何自动生成和配置默认语言环境而不是以交互方式执行此操作的示例,请查看this Docker image