让我们拿一个简单的变量 -
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 :(得分: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对象可以表示为字节串)。