在Linux Docker容器上运行时出现gsub编码错误,无效的US-ASCII字节序列



我有一个字符串,我正在转换从"rn""n"行结束使用:

input.gsub(/rn?/, "n")

当我在Windows主机上运行它时,它工作得很好。当我在Linux主机上运行docker容器时,我得到这个错误:

in `gsub': invalid byte sequence in US-ASCII (ArgumentError)

我正在运行Ruby 2.2。

我通过在UTF-8 (ArgumentError)中执行无效字节序列来修复它

回答这个问题是为了记录文档。看起来这个编码问题并不是孤立于用户的单个字符串,而是docker中已知的问题,如下所示:

https://oncletom.io/2015/docker-encoding/

似乎有些映像依赖于原始Debian映像和:

Debian在2011年移除了对locale包的依赖。它解释了en_US.UTF-8的不可用性。

这将解释为什么有些docker镜像在继承系统配置时不能使用UTF-8。

$ docker run -ti --rm ruby:2.1.5 ruby -e 'puts STDIN.external_encoding'
> US-ASCII
docker中的

locale命令在系统中应该是空值的地方显示空值:

$ docker run -ti --rm ruby:2.1.5 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=

在初始化时定义LOCALE变量应该可以工作:

$ docker run -ti --rm -e LANG=C.UTF-8 ruby:2.1.5 ruby -e 'puts STDIN.external_encoding'
> UTF-8

更好的是,你可以在Dockerfile

中定义它
#/Dockerfile
FROM ruby:2.1.5
ENV LANG C.UTF-8

最新更新