我制作了一个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
我该如何解决这个问题?
答案 0 :(得分:3)
您在打印之前将Unicode文本编码为UTF-8:
print key.encode('utf-8') + ' : ' + value.encode('utf-8')
但是,您的控制台或终端未配置为解释UTF-8。它正在被发送字节,然后它基于不同的编解码器一起显示字符。
您的value
包含\u2013
或U+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'