2015-05-19 126 views
0

让我们举一个简单的变量 -Python中的Unicode编码解码问题

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

让我知道,别人在做什么?

+0

你在哪里运行? –

+0

你只是不明白'unicode'和'bytes'的区别。然而,Python 27并没有设法让它正确:unicode对象有一个'.decode'方法,并且bytestrings有一个'.encode',这是一个无意义的。 – bgusach

回答

2

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

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

您无法解码unicode字符串。

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

(事后看来,这一尝试在“做什么我的意思”的行为是错误的。Python 3里不再允许它。)

我得到“ASCII”编解码器不能解码位置字节0xe2 8:在范围序数不(128)

你正在做别的事情,你有没有告诉我们,然后,因为编码工作正常:

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

一种解决方案是做sys.setdefaultencoding函数(“UTF-8”)

这是从来没有一个妥善解决事情,这是为什么Python中需要一些措施来阻止你这样做。

0

声明

>>> 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对象可以表示为字节串)。