在python中从返回的JSON转换unicode字符

2024-06-17 14:08:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从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 D\u2019Agostino"
                }],
                "title": "You Spin Me Round"
            }],
            "id": "2e0a7bce-9e44-4a63-a789-e8c4d2a12af9"
        }, ....

失败代码(示例):

^{pr2}$

我在一台Windows7机器上使用它,并且有Python2.7并在命令行终端上运行这段代码。。我得到的输出如下:

C:\Python27>python junk.py Gigi DGÇÖAgostino Gigi D?Agostino Gigi D\u2019Agostino

我希望输出是Gigi D' Agostino


Tags: 数据代码apiidjsontitleunicodeposition
3条回答

您应该像任何有效的json解析器一样使用返回Unicode字符串的json解析器。失败的示例显示了一个bytestring,也就是说,您没有使用json解析器。在

例如,要解析json数据:

obj = json.load(urllib2.urlopen(request))

要在不使用Unicode转义符的情况下漂亮地打印obj,请执行以下操作:

^{pr2}$

了解以下两者之间的区别也很有用:

print unicode_string

以及:

print repr(unicode_string)

您正在Windows中使用cmd?在这种情况下,让Unicode正常工作以正确显示可能有点麻烦。 您可能需要考虑使用另一个“终端”来测试脚本。 MSYS提供了一个不错的终端/shell,IDLE包含在Windows Python发行版中,并且有一个pythonshell(右键单击,在IDLE中打开,F5)。在

如果您真的想让它在cmd中工作:

您必须将Lucida Console设置为cmd中的字体。然后:

> chcp
Active code page: 850
> chcp 65001

那么您应该在cmd中有unicode输出。你的“活动代码页”可能不同。请注意,在某个地方,因为您可能希望在以后更改它:

^{pr2}$

否则,您将遇到其他问题(启动.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

我的脚本也有类似的bug report。在


您还可以考虑使用库来访问MusicBrainzWeb服务。 Python-musicbrainzngs与当前的ws/2一起工作。在

Unicode转义仅适用于Unicode字符串,要将常规字符串转换为Unicode,请使用str.decode('unicode-escape'):

In [1]: s='\u0420\u043e\u0441\u0441\u0438\u044f'

In [2]: s
Out[2]: '\\u0420\\u043e\\u0441\\u0441\\u0438\\u044f'

In [3]: s.decode('unicode-escape')
Out[3]: u'\u0420\u043e\u0441\u0441\u0438\u044f'

In [4]: print s.decode('unicode-escape')
Россия

In [5]: s2="Gigi D\u2019Agostino"

In [6]: s2
Out[6]: 'Gigi D\\u2019Agostino'

In [7]: print s2.decode('unicode-escape')
Gigi D’Agostino

相关问题 更多 >