我有一个字符串,我正在转换从"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