Python unicode错误。UnicodeEncodeError:&x27;ascii';编解码器可以';t编码字符u'\u4e3a';
因此,我有这段代码从Python unicode错误。UnicodeEncodeError:&x27;ascii';编解码器可以';t编码字符u'\u4e3a';,python,unicode,encoding,utf-8,python-2.x,Python,Unicode,Encoding,Utf 8,Python 2.x,因此,我有这段代码从url url = 'http://....' response = urllib2.urlopen(rul) string = response.read() data = json.loads(string) for x in data: print x['foo'] 问题是x['foo'],如果尝试如上所示打印它,我会遇到此错误 警告:第1行“说明”列的字符串值“\xE4\xB8\xBA Co…”不正确 如果我使用x['foo'].decode(“utf-
url
url = 'http://....'
response = urllib2.urlopen(rul)
string = response.read()
data = json.loads(string)
for x in data:
print x['foo']
问题是x['foo']
,如果尝试如上所示打印它,我会遇到此错误
警告:第1行“说明”列的字符串值“\xE4\xB8\xBA Co…”不正确
如果我使用x['foo'].decode(“utf-8”)
我会得到以下错误:
UnicodeEncodeError:“ascii”编解码器无法对位置0中的字符u'\u4e3a'进行编码:序号不在范围内(128)
如果我尝试,encode('ascii','ignore')。decode('ascii')
然后我得到了这个错误
x['foo'].encode('ascii','ignore').decode('ascii'))
AttributeError:“非类型”对象没有属性“encode”
有什么方法可以解决这个问题吗?x['foo'].解码(“utf-8”)
导致unicode编码错误
意味着x['foo']
是unicode
类型。获取str
类型并将其转换为unicode
类型。Python2试图在这里提供帮助,并尝试将您的unicode
隐式转换为str
,以便您可以对其调用decode
。它使用sys.defaultencoding
,也就是ascii
,无法对所有Unicode编码,因此出现了异常
这里的解决方案是删除decode
调用-该值已经是unicode
阅读Ned Batchelder的演示文稿——它将大大增强您对这一点的理解,并有助于防止将来出现类似错误
这里值得注意的是,json.load
返回的所有内容都是unicode
而不是str
编辑后解决新问题: 当您打印
时,需要字节-unicode是一个抽象概念。您需要从抽象unicode字符串到字节的映射-在python术语中,您必须将unicode
对象转换为str
。您可以通过调用encode
来实现这一点,编码告诉它如何将抽象字符串转换为具体字节。通常,您希望使用utf-8编码
这应该起作用:
print x['foo'].encode('utf-8')
阅读,谢谢你的链接。我会看一看,但是现在,如果有一个答案就好了,因为我确信,即使在删除decode
时,我也会出错。数组中的所有其他列表都很好,但有时x['foo']
包含表情符号,这就导致了问题。这回答了您发布的问题;如果你的应用程序中出现其他错误,那是因为你仍然犯同样的错误(混淆了unicode和str类型)。阅读此链接可以提供一些非常深入的解释和指导,以防止在allI发生这种情况,我很抱歉。我原以为这样就可以了,但我得到了警告:第1行的'foo'列的字符串值不正确:'\xE4\xB8\xBA Co..。
使用您建议的x['foo'].encode('utf-8')
。我真的需要导入
一些库才能使编码工作吗?@arbi-g11324115是打印
给了你这个错误还是别的什么?我想特别提出一个新问题,因为听起来您使用的数据库库不能很好地处理unicode。在我的脑海中,因为你提到了表情符号,你可能正在运行一个有点旧的mysql版本?一些表情符号是unicode标准的新版本,mysql的旧版本不支持它yetMaybe就是这样。我真的不知道。我使用的是mysql 5.4,下面是我如何设置unicodeconn=MySQLdb.connect(“****”、“root”、“****”、“****”、“****”)conn.set\u character\u set('utf8')cursor=conn.cursor()cursor.execute('set NAMES utf8;'))cursor.execute('set character set\u connection=utf8;'))cursor.execute('set character\u set\u connection=utf8;'))