Python2.7使用十六进制字符从unicode打印错误的字符

时间:2016-02-24 16:02:58

标签: python python-2.7 unicode hex unicode-string

sys.getdefaultencoding()
-> utf8
test = u'tempête'
test
-> u'temp\xc3\xaate'
print(test)
-> tempête # WTF ?

sys.setdefaultencoding('ascii')
sys.getdefaultencoding()
-> ascii
test = u'tempête'
test
-> u'temp\xc3\xaate'
print(test)
-> tempête #...

当我从pdb执行set_trace()时,我会观察到这些结果。

在python2.7 shell中我得到了正确的结果:

sys.getdefaultencoding()
-> ascii
test = u'tempête'
test
-> u'temp\xc3\xaate'
print(test)
-> tempête # WTF ?

我正在努力解决这个问题......

1 个答案:

答案 0 :(得分:1)

确保您的locale编码与终端仿真匹配。输入locale进行检查。

sys.setdefaultencoding()与打印无关 - Python使用您的语言环境来设置打印时使用的stdout编码。见sys.stdout.encoding

我可以像这样部分复制你的问题:

  1. 将终端仿真设置为:UTF-8
  2. 将语言环境设置为en_GB.ISO8859-1。即不是UTF-8

    export LANG=en_GB.ISO8859-1
    
  3. 运行您的代码:

    >>> test = u'tempête'
    >>> test
    u'temp\xc3\xaate'
    
  4. ê成为Ã(U + 00C3)和ª(U + 00AA)的事实是问题的关键,表明Python认为编码应该是8位字符集。

    我无法复制你的最终版画,但我怀疑摆弄setdefaultencoding()并煮熟一切 - 请参阅我的回答,了解为什么这是一个坏主意:https://stackoverflow.com/a/34378962/1554386