什么可以导致不同的python 3.4 bytes.decode()跨不同的安装行为

问题描述:

我看到不同的行为解码Python 3.4.3上的字节字符串跨两个盒子 - 一个运行OS X和另一个Debian Wheezy。什么可以导致不同的python 3.4 bytes.decode()跨不同的安装行为

在OS X:

$ python 
Python 3.4.3 (default, Mar 10 2015, 14:53:35) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = b'\xc4\x8dtrn\xc3\xa1ct' 
>>> print(s.decode("utf-8")) 
čtrnáct 

在Debian:

$ python 
Python 3.4.3 (default, Apr 4 2015, 22:21:17) 
[GCC 4.7.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = b'\xc4\x8dtrn\xc3\xa1ct' 
>>> print(s.decode("utf-8")) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character '\u010d' in position 0: ordinal not in range(128) 

必须有东西在这两个安装这是造成这个配置略有不同。我检查了两者的默认编码,结果是相同的,但我不确定我可以检查什么。

>>> import sys 
>>> sys.getdefaultencoding() 
'utf-8' 

更新:现场返回两者之间的差异:

OS X:

LANG= 
LC_COLLATE="C" 
LC_CTYPE="UTF-8" 
LC_MESSAGES="C" 
LC_MONETARY="C" 
LC_NUMERIC="C" 
LC_TIME="C" 
LC_ALL= 

Debian的:

$ locale 
locale: Cannot set LC_CTYPE to default locale: No such file or directory 
locale: Cannot set LC_ALL to default locale: No such file or directory 
LANG=en_US.UTF-8 
LANGUAGE=en_US:en 
LC_CTYPE=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= 
+0

什么'locale'或'echo $ LANG' bash输出? – 2015-04-04 22:48:59

+0

'echo $ LANG'在OSX上不返回任何内容,而在Debian上则为“en_US.UTF-8”。我已经将'locale'结果添加为编辑 – Sean 2015-04-04 22:59:06

+0

尝试设置'LC_ALL =“en_US.utf8”'如果这样做'sudo locale -gen en_US.UTF-8' – 2015-04-04 23:11:00

我找到了答案 - 我也跟着“区域设置:配置“部分http://perlgeek.de/en/article/set-up-a-clean-utf8-environment。特别是有用的步骤是:

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8 
+0

它也没有在文章中提到设置LC_ALL优先于其他大部分。你也应该在'$ HOME/.pam_environment'或者'/ etc/default/local'中设置 – 2015-04-04 23:38:39