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

Python json键值打印期间打印的奇怪字符,python,json,python-2.7,utf-8,character-encoding,Python,Json,Python 2.7,Utf 8,Character Encoding,我制作了一个python程序,使用OMDb API获取电影/电视节目信息 我在打印电视节目的运行年份时出错。下面是发生这种情况的代码的一部分: keys = ['Title', 'Year', 'imdbRating', 'Director', 'Actors', 'Genre', 'totalSeasons'] def jsonContent(self): payload = {'t':self.title} movie = requests.get(self

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

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

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

如何解决此问题?

您正在将Unicode文本编码为UTF-8,然后再打印:

print key.encode('utf-8') + ' : ' + value.encode('utf-8')
但是,您的控制台或终端未配置为解释UTF-8。它被发送字节,然后显示基于不同编解码器的字符

您的
包含一个
\u2013
或字符,该字符将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=cp437:replace
:replace
部分将告诉Python对cp437进行编码,但对无法处理的字符使用占位符。您将得到一个问号:

>>> print value.encode('cp437', 'replace')
2005?2014
注意,在所有这些示例中,我必须显式地编码到CP437。由于Python检测到了您的配置,您不必担心,它会自动为您执行此操作。只要坚持直接打印Unicode即可

另一种选择是使用近似值替换非ASCII字符;它将用ASCII破折号替换en破折号:

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

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

print key.encode('utf-8') + ' : ' + value.encode('utf-8')
但是,您的控制台或终端未配置为解释UTF-8。它被发送字节,然后显示基于不同编解码器的字符

您的
包含一个
\u2013
或字符,该字符将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=cp437:replace
:replace
部分将告诉Python对cp437进行编码,但对无法处理的字符使用占位符。您将得到一个问号:

>>> print value.encode('cp437', 'replace')
2005?2014
注意,在所有这些示例中,我必须显式地编码到CP437。由于Python检测到了您的配置,您不必担心,它会自动为您执行此操作。只要坚持直接打印Unicode即可

另一种选择是使用近似值替换非ASCII字符;它将用ASCII破折号替换en破折号:

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


这似乎是一个编码问题。也许您在代码中添加的修复是不必要的。当您的终端或控制台不使用UTF-8时,为什么要解压到UTF-8?这就是这里发生的事情:您的终端或控制台正在将UTF-8字节解码为另一个编解码器。我打印时没有它。但是,它给了UnicodeEncodeError。@hash_ir:这是因为您的控制台或终端无法处理文本中的特定字符。这似乎是一个编码问题。也许您在代码中添加的修复是不必要的。当您的终端或控制台不使用UTF-8时,为什么要解压到UTF-8?这就是这里发生的事情:您的终端或控制台正在将UTF-8字节解码为另一个编解码器。我打印时没有它。但是,它给出了UnicodeEncodeError.@hash_ir:这是因为您的控制台或终端无法处理文本中的特定字符。可能还需要指出,正确的修复方法是将您的系统配置为正确处理UTF-8输出。可能链接到此常见问题解答的众多副本之一。如果我直接打印密钥和值,将显示以下错误:UnicodeEncodeError:“charmap”编解码器无法对位置11中的字符u'\u2013'进行编码:字符映射到@tripleee:,这在Windows上几乎是不可能的,很遗憾。如何设置此类字符的占位符?
unidecode
有效。谢谢你解释这一切。下次我会记住这一点。也许还需要指出,正确的修复方法是配置您的系统以正确处理UTF-8输出。可能链接到此常见问题解答的众多副本之一。如果我直接打印密钥和值,将显示以下错误:UnicodeEncodeError:“charmap”编解码器无法对位置11中的字符u'\u2013'进行编码:字符映射到@tripleee:,这在Windows上几乎是不可能的,很遗憾。如何设置此类字符的占位符?
unidecode
有效。谢谢你解释这一切。下次我会记住的。