以下事情真的让我感到困惑,我的笔记本电脑上的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')
'’'
>>>
Docker ubuntu上的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'
>>>
我可以在Docker的ubuntu上制作python3编解码器:可信解码b' \ xe2 \ x80 \ x99' as'''?
答案 0 :(得分:2)
以下说明了正在发生的事情以及如何解决问题:
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
答案 1 :(得分:0)
这听起来像是语言环境配置问题。 Python在两个位置的行为可能不同,因为它运行的终端会话配置不同。
检查Ubuntu Docker计算机上的locale
设置,确保您在终端会话中处于UTF-8语言环境中。特别是,请查看您是否已C
切换到CTYPE
。 (我以前在服务器上看到过,虽然不知道它为什么会发生。)这可能会对Python控制台是否认为它是一个可打印的角色以及因此是将其显示为自身还是逃脱序列。这也会影响其他终端程序。
我能够通过摆弄语言环境设置,在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文件,以将您的语言环境配置为适合您的UTF-8语言环境,或者将您的语言环境设置设置为通过SSH或您正在使用的任何连接方法传播,以便在那里配置您的远程终端会话。通过连接传播您的语言环境可能更有意义,因为它可以为您连接的其他服务器或帐户修复它。