在json键值打印期间打印奇怪的字符

时间:2016-07-31 09:24:55

标签: python json python-2.7 utf-8 character-encoding

我制作了一个python程序,使用OMDb API获取电影/电视节目信息http://www.omdbapi.com/

我在打印电视节目的运行年份时遇到错误。这是发生这种情况的代码的一部分:

keys = ['Title', 'Year', 'imdbRating', 'Director', 'Actors', 'Genre', 'totalSeasons']

def jsonContent(self):
        payload = {'t':self.title}
        movie = requests.get(self.url, params = payload)
        return movie.json()

def getInfo(self):
        data = self.jsonContent()
        for key, value in data.items():
            if key in keys:
                print key.encode('utf-8') + ' : ' + value.encode('utf-8')

例如,如果我搜索我如何遇见你的母亲,它打印出来像这样:

totalSeasons : 9
Title : How I Met Your Mother
imdbRating : 8.4
Director : N/A
Actors : Josh Radnor, Jason Segel, Cobie Smulders, Neil Patrick Harris
Year : 2005ΓÇô2014     #problem here
Genre : Comedy, Romance

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您在打印之前将Unicode文本编码为UTF-8:

print key.encode('utf-8') + ' : ' + value.encode('utf-8')

但是,您的控制台或终端未配置为解释UTF-8。它正在被发送字节,然后它基于不同的编解码器一起显示字符。

您的value包含\u2013U+2013 EN DASH个字符,该字符将UTF-8编码为3个字节E2 80 93,您的终端似乎将其解码为Windows代码页437 :

>>> value = u'2005\u20132014'
>>> print value
2005–2014
>>> print value.encode('utf8').decode('cp437')
2005ΓÇô2014

重新配置您的控制台或终端,或将PYTHONIOENCODING environment variable设置为使用错误处理程序:

PYTHONIOENCODING=cp437:replace

:replace部分将告诉Python编码为cp437,但是将占位符用于它无法处理的字符。你会得到一个问号:

>>> print value.encode('cp437', 'replace')
2005?2014

请注意,我必须在所有这些示例中明确地编码为CP437。 您没有,因为Python已检测到您的配置,并会自动为您执行此操作。只是坚持直接打印Unicode。

另一种方法是使用Unicodecode package替换非近似的非ASCII字符;它将用ASCII破折号替换en-dash:

>>> from unidecode import unidecode
>>> value
u'2005\u20132014'
>>> unidecode(value)
'2005-2014'