【问题标题】:Python Unicode Encode Decode IssuePython Unicode 编码解码问题
【发布时间】:2015-05-19 10:33:16
【问题描述】:

让我们取一个简单的变量 -

var =  u' \u2013 2'

让我们尝试解码它 -

var.decode('utf-8')

我收到以下错误 -

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 7: ordinal not in range(128)

让我们尝试编码它 -

var.encode('utf-8')

我收到以下错误 -

'ascii' codec can't decode byte 0xe2 in position 8: ordinal not in range(128)

一个解决方案是做 -

sys.setdefaultencoding('utf-8')

让我知道,其他人在做什么?

【问题讨论】:

  • 你在哪里运行这个?
  • 你只是不明白unicodebytes之间的区别。然而,Python 27 并没有做到这一点:unicode 对象有一个 .decode 方法,而字节串有一个 .encode,这是毫无意义的。

标签: python string unicode utf-8


【解决方案1】:

让我们尝试解码 [一个 Unicode 字符串]

解码字节为Unicode。您将 Unicode 编码为字节。

您无法解码 unicode 字符串。

如果您尝试,Python 会尝试通过自动将 Unicode 字符串转换为它可以解码的东西来帮助您:字节字符串。由于这是隐含的,因此它使用您平台的默认编码,即 ASCII。 ASCII 不能编码 U+2013 所以你有错误。

(事后看来,这种“按我的意思做”行为的尝试是一个错误。Python 3 不再允许这样做。)

我得到“ascii”编解码器无法解码位置 8 的字节 0xe2:序数不在范围内 (128)

那么,你正在做一些你没有向我们展示过的事情,因为编码工作正常:

>>> u' \u2013 2'.encode('utf-8')
' \xe2\x80\x93 2'

一种解决方案是使用 sys.setdefaultencoding('utf-8')

这从来都不是解决任何问题的正确方法,这就是 Python 采取一些措施来阻止你这样做的原因。

【讨论】:

    【解决方案2】:

    声明

    >>> var =  u' \u2013 2'
    

    在您的程序中创建一个 Unicode 字符串对象。您似乎犯的错误是假设 Unicode 对象已编码:它们不是,它们采用适合 Python 代码直接使用的形式。

    当您要传输 Unicode 字符串时,您必须以字节序列的形式进行,这意味着您的字符串必须经过编码

    >>> var.encode("utf-8")
    

    给出结果

    ' \xe2\x80\x93 2'
    

    这确实是您以 UTF-8 编码的原始字符串。您可以使用

    验证这一点
    >>> var.encode('utf-8').decode('utf-8')
    

    它会返回原始的 Unicode 字符串:

    u' \u2013 2'
    

    记住 - 在输入时解码(将外部表示转换为 Unicode 对象),在输出时编码(因此您的 Unicode 对象可以表示为字节字符串)。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2016-04-01
      • 2019-12-19
      • 2012-04-10
      • 2015-03-15
      • 2011-07-14
      • 2011-06-15
      • 2016-07-07
      相关资源
      最近更新 更多