Python3的UTF8编解码器没有按照预期在docker解码Ubuntu的:可靠

下面的东西真的让我感到困惑,我的笔记本电脑上的python版本以及Docker的Ubuntu中的python版本:可靠的图像打印不同的结果与他们的编解码器,这是什么原因? 例如,我的笔记本上的python3(ubuntu,trusty):

Python 3.4.3 (default, Apr 14 2015, 14:16:55) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import codecs >>> codecs.decode(b'\xe2\x80\x99','utf8') ''' >>> 

python3上的Docker Ubuntu的:最新的:

 Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import codecs >>> codecs.decode(b'\xe2\x80\x99','utf8') '\u2019' >>> 

我可以做的Docker的Ubuntu的python3编解码器:可靠的解码b'\ xe2 \ x80 \ x99'作为'''?

这听起来像一个语言环境configuration问题。 Python可能在两个位置的行为不同,因为它运行的terminal会话configuration不同。

在您的Ubuntu Docker机器上检查您的locale设置,以确定您在terminal会话中处于UTF-8语言环境。 特别是,看看你是否已经转换到C为您的CTYPE 。 (我以前在服务器上已经看到过,但是不知道为什么会发生这种情况。)这可能会影响Python控制台是否将其视为可打印的字符,从而将其显示为自身还是转义序列。 这也会影响其他terminal程序。

我能够通过摆脱语言环境设置在OS X上的Python 3.4.0中重现此行为。

 [@ in ~] $ locale LANG="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_ALL= [@ in ~] $ python3.4 Python 3.4.0 (v3.4.0:04f714765c13, Mar 15 2014, 23:02:41) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import codecs >>> codecs.decode(b'\xe2\x80\x99','utf8') ''' >>> quit() [@ in ~] $ LC_CTYPE=C python3.4 Python 3.4.0 (v3.4.0:04f714765c13, Mar 15 2014, 23:02:41) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import codecs >>> codecs.decode(b'\xe2\x80\x99','utf8') '\u2019' >>> quit() 

如果是您的语言环境设置,则需要在Docker Ubuntu实例上设置您的rc文件,以将您的语言环境configuration为适合您的UTF-8语言环境,或者让您的语言环境设置通过SSH或任何连接方法传播你正在使用,为了configuration你的远程terminal会话在那里。 通过连接传播您的语言环境可能更有意义,因为它可以修复其他服务器或您连接的帐户。

以下说明发生了什么以及如何解决它:

 root@df329ec1fe88:/# python3 Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import codecs >>> codecs.decode(b'\xe2\x80\x99','utf8') '\u2019' >>> exit() root@df329ec1fe88:/# locale -a C C.UTF-8 POSIX root@df329ec1fe88:/# 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= root@df329ec1fe88:/# sudo locale-gen "en_US.UTF-8" Generating locales... en_US.UTF-8... done Generation complete. root@df329ec1fe88:/# sudo dpkg-reconfigure locales Generating locales... en_US.UTF-8... up-to-date Generation complete. root@df329ec1fe88:/# echo "export LC_ALL=en_US.utf8" >> ~/.bashrc root@df329ec1fe88:/# echo "export LANG=en_US.utf8" >> ~/.bashrc root@df329ec1fe88:/# echo "export LANGUAGE=en_US.utf8" >> ~/.bashrc root@df329ec1fe88:/# source ~/.bashrc root@df329ec1fe88:/# locale LANG=en_US.utf8 LANGUAGE=en_US.utf8 LC_CTYPE="en_US.utf8" LC_NUMERIC="en_US.utf8" LC_TIME="en_US.utf8" LC_COLLATE="en_US.utf8" LC_MONETARY="en_US.utf8" LC_MESSAGES="en_US.utf8" LC_PAPER="en_US.utf8" LC_NAME="en_US.utf8" LC_ADDRESS="en_US.utf8" LC_TELEPHONE="en_US.utf8" LC_MEASUREMENT="en_US.utf8" LC_IDENTIFICATION="en_US.utf8" LC_ALL=en_US.utf8 root@df329ec1fe88:/# python3 Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import codecs >>> codecs.decode(b'\xe2\x80\x99','utf8') ''' >>> exit() root@df329ec1fe88:/# 

然后你可以提交这个容器作为一个新的图像供将来使用,或者你可以在Dockerfile中自动执行这个过程。 基本上添加以下几行:

 RUN locale-gen "en_US.UTF-8" RUN dpkg-reconfigure locales RUN echo "export LC_ALL=en_US.utf8" >> ~/.bashrc RUN echo "export LANG=en_US.utf8" >> ~/.bashrc RUN echo "export LANGUAGE=en_US.utf8" >> ~/.bashrc