【问题标题】:Change the default encoding for automatic str to unicode conversion将自动 str 的默认编码更改为 unicode 转换
【发布时间】:2014-09-04 04:50:51
【问题描述】:

在进行以下串联时:

a = u'Hello there '
b = 'pirate ®'
c = a + b # This will raise UnicodeDecodeError

在python 2中,'pirate ®'通过ascii编码自动转换为unicode类型。而且由于字符串中有非ascii unicode序列(®),所以会失败。

有没有办法将此默认编码更改为 utf8?

【问题讨论】:

  • @KobiK 这不是被问到的
  • 在任何地方都使用 unicode 字符串,并显式转换来自外部世界的 str 字符串。
  • 不行 - 我开始使用模板库,它只接受 str 类型的所有内容,我的代码使用 unicode 文字和几乎所有 unicode。

标签: python python-2.7 python-unicode


【解决方案1】:

这是可能的,尽管它被认为是一种黑客行为。你必须重新加载sys

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

有关由此引发的潜在问题的一些解释,请参阅此博客文章: http://blog.startifact.com/posts/older/changing-the-python-default-encoding-considered-harmful.html

这可能是您唯一的选择,但您应该意识到它可能会导致更多问题。这就是为什么它不是一件容易设置的事情。

【讨论】:

    【解决方案2】:

    来自 Python Unicode Howto:

    理想情况下,您希望能够以您的语言的自然编码编写文字。然后,您可以使用自己喜欢的编辑器编辑 Python 源代码,该编辑器自然地显示重音字符,并在运行时使用正确的字符。

    Python 支持以任何编码编写 Unicode 文字,但您必须声明所使用的编码。这是通过在源文件的第一行或第二行包含一个特殊注释来完成的:

    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
    
    u = u'abcdé'
    print ord(u[-1])
    

    【讨论】:

    • 这与 unicode 文字无关。如果你有x + y,其中x 是unicode 类型和ystr 类型,并且y 有一个utf8 序列,x + y 会由于使用默认ascii 而引发同样的异常编码。
    • 好吧,我误会了。那么有这样的事情吗? c = ''.join([(c.decode('utf-8') if isinstance(c, str) else c) for c in [a,b] ])
    • 查看accepted answer,这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2015-04-14
    • 2017-02-27
    • 2010-10-29
    相关资源
    最近更新 更多