Python unicode error. UnicodeEncodeError: 'ascii' codec can't encode character u'\u4e3a'

Python unicode error. UnicodeEncodeError: 'ascii' codec can't encode character u'\u4e3a'

所以,我有这段代码可以从 url

中获取 JSON 字符串
url = 'http://....'
response = urllib2.urlopen(rul)
string = response.read()
data = json.loads(string)

for x in data: 
    print x['foo']

问题是 x['foo'],如果尝试按上面所示打印它,我会收到此错误。

Warning: Incorrect string value: '\xE4\xB8\xBA Co...' for column 'description' at row 1

如果我使用 x['foo'].decode("utf-8") 我会得到这个错误:

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

如果我尝试,encode('ascii', 'ignore').decode('ascii') 然后我得到这个错误。

x['foo'].encode('ascii', 'ignore').decode('ascii') AttributeError: 'NoneType' object has no attribute 'encode'

有什么办法可以解决这个问题吗?

x['foo'].decode("utf-8") 导致 UnicodeEncodeError 意味着 x['foo']unicode 类型。 str.decode 采用 str 类型并将其转换为 unicode 类型。 Python 2 试图在这里提供帮助,并尝试将您的 unicode 隐式转换为 str,以便您可以调用 decode。它使用 sys.defaultencoding 执行此操作,即 ascii,它无法编码所有 Unicode,因此例外。

此处的解决方案是删除 decode 调用 - 值已经是 unicode.

阅读 Ned Batchelder 的演示文稿 - Pragmatic Unicode - 它将大大增强您对此的理解并有助于防止将来出现类似错误。

这里值得注意的是 json.load 返回的所有内容都是 unicode 而不是 str.


编辑后解决新问题:

当你 print 时,你需要字节 - unicode 是一个抽象概念。您需要从抽象 unicode 字符串到字节的映射 - 在 python 术语中,您必须将 unicode 对象转换为 str。您可以通过使用一种编码调用 encode 来做到这一点,该编码告诉它如何将抽象字符串转换为具体字节。一般要使用utf-8编码。

这应该有效:

print x['foo'].encode('utf-8')