2

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"
        }, ....

失敗したコード (例):

string = '\u0420\u043e\u0441\u0441\u0438\u044f'
print string.encode('utf-8')

私はこれをWindows 7マシンで使用しており、Python 2.7を使用しており、コマンドライン端末でこのコードを実行しています.以下の出力があります。

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

出力がGigi D' Agostino

4

3 に答える 3

1

Unicode escape only works with unicode strings, to convert your regular string to unicode use 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
于 2013-01-15T20:54:33.523 に答える
0

有効な json パーサーと同様に、Unicode 文字列を返す json パーサーを使用する必要があります。失敗した例は、バイト文字列を示しています。つまり、json パーサーを使用していません。

たとえば、json データを解析するには、次のようにします。

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

objUnicode エスケープを使用せずにきれいに印刷するには:

print json.dumps(obj, indent=4, ensure_ascii=False)

次の違いを理解することも役に立ちます。

print unicode_string

と:

print repr(unicode_string)
于 2013-01-16T03:13:42.837 に答える
0

cmdWindows でを使用していますか? その場合、正しく表示するために Unicode をまったく機能させるのはちょっとしたハックかもしれません。別の「端末」を使用してスクリプトをテストすることを検討することをお勧めします。 MSYSは優れたターミナル/シェルを提供し、IDLE は Windows Python ディストリビューションに含まれており、Python シェル (右クリック、IDLE で開く、F5) を備えています。

で本当に動作させたい場合cmd

Lucida Consoleでフォントとして設定する必要がありcmdます。それで:

> chcp
Active code page: 850
> chcp 65001

次に、にユニコード出力が必要ですcmd。「アクティブ コード ページ」は異なる場合があります。後で元に戻したい場合があるため、次の点に注意してください。

> 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 サービスにアクセスすることも検討してください。 Python-musicbrainzngsは現在の ws/2 で動作します。

于 2013-01-16T03:46:45.373 に答える