我试图从musicbrainz的API服务返回JSON,一些歌曲的返回数据有unicode字符,我有麻烦将它们转换为常规符号等。请让我知道我在这里应该做什么。
JSON:{
"status": "ok",
"results": [{
"recordings": [{
"duration": 402,
"tracks": [{
"duration": 402,
"position": 6,
"medium": {
"release": {
"id": "dde6ecee-8e9b-4b46-8c28-0f8d659f83ac",
"title": "Tecno Fes, Volume 2"
},
"position": 1,
"track_count": 11
},
"artists": [{
"id": "57c1e5ea-e08f-413a-bcb1-f4e4b675bead",
"name": "Gigi Du2019Agostino"
}],
"title": "You Spin Me Round"
}],
"id": "2e0a7bce-9e44-4a63-a789-e8c4d2a12af9"
}, ....
失败代码(示例):
string = 'u0420u043eu0441u0441u0438u044f'
print string.encode('utf-8')
我在windows 7机器上使用这个,并且有python 2.7并在命令行终端上运行此代码。我得到的输出如下:
C:Python27>python junk.py Gigi DGÇÖAgostino Gigi D?Agostino Gigi Du2019Agostino
我期望输出是Gigi D' Agostino
Unicode转义仅适用于Unicode字符串,使用str.decode('unicode-escape')
:
In [1]: s='u0420u043eu0441u0441u0438u044f'
In [2]: s
Out[2]: '\u0420\u043e\u0441\u0441\u0438\u044f'
In [3]: s.decode('unicode-escape')
Out[3]: u'u0420u043eu0441u0441u0438u044f'
In [4]: print s.decode('unicode-escape')
Россия
In [5]: s2="Gigi Du2019Agostino"
In [6]: s2
Out[6]: 'Gigi D\u2019Agostino'
In [7]: print s2.decode('unicode-escape')
Gigi D’Agostino
您在Windows中使用cmd
吗?在这种情况下,让Unicode正常工作以正确显示可能有点麻烦。您可能想要考虑使用另一个"终端"来测试脚本。MSYS提供了一个很好的终端/shell, IDLE包含在Windows Python发行版中,并且有一个Python shell(右键单击,在IDLE中打开,F5)。
如果你真的想让它在cmd
中工作:
您必须将Lucida Console
设置为cmd
中的字体。然后:
> chcp
Active code page: 850
> chcp 65001
那么您应该在cmd
中有unicode输出。您的"活动代码页"可能会有所不同。注意,在某个地方,因为您可能想要在之后更改它:
> chcp 850
否则,您将遇到其他问题(启动.bat
文件不起作用)。(参见batch-file-encoding)
在你的脚本中,你还需要这个:
import codecs
def cp65001(name):
"""This might be buggy, but better than just a LookupError
"""
if name.lower() == "cp65001":
return codecs.lookup("utf-8")
codecs.register(cp65001)
否则python将崩溃。(见windows-cmd-encoding-change-causes-python-crash)
我的脚本有一个类似的错误报告。
您还可以考虑使用库来访问MusicBrainz Web Service。python - musicbrainzings工作于当前ws/2
你应该使用json解析器返回Unicode字符串作为任何有效的json解析器。你失败的例子显示了一个字节串,即,你没有使用json解析器。
例如,解析json数据:
obj = json.load(urllib2.urlopen(request))
不使用Unicode转义而美观地打印obj
:
print json.dumps(obj, indent=4, ensure_ascii=False)
理解以下两者的区别也很有用:
print unicode_string
:
print repr(unicode_string)