Python Unicode编码解码问题

时间:2015-05-19 10:33:17

标签: python string unicode utf-8

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

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')

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

2 个答案:

答案 0 :(得分:2)

  

让我们尝试解码[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采取一些措施来阻止你这样做。

答案 1 :(得分:0)

声明

SelectedIndex

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

如果要传输Unicode字符串,则必须以字节序列的形式执行此操作,这意味着您的字符串必须编码

>>> var =  u' \u2013 2'

给出结果

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

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

进行验证
' \xe2\x80\x93 2'

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

>>> var.encode('utf-8').decode('utf-8')

记住 - 在路上解码(将外部表示转换为Unicode对象),在路上编码(因此你的Unicode对象可以表示为字节串)。