4

私はこの文字列を持っていますTraor\u0102\u0160

Traor\u0102\u0160生成する必要がありTraoréます。次にTraoré、デコードされたutf-8が生成するはずですTraorè

どのように変換できTraorèますか?

文字とはTraor\u0102\u0160何ですか?ユニコード?

私はすでにこのhttp://docs.python.org/howto/unicode.html#encodingsを何度も読んでいます。しかし、私はまだ本当に混乱しています。

次のリクエストでこのデータを取得します。

import json
import requests

# making a request to get this json
r = requests.get('http://cdn.content.easports.com/fifa/fltOnlineAssets/2013/fut/items/web/199074.json')
print r.json

解決

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import json
import requests

headers = {'Content-Type': 'application/json'}

r = requests.get('http://cdn.content.easports.com/fifa/fltOnlineAssets/2013/fut/items/web/199074.json', headers=headers)


print r.content

#prints
{"Item":{"FirstName":"Lacina","LastName":"Traoré","CommonName":null,"Height":"203","DateOfBirth":{"Year":"1990","Month":"8","Day":"20"},"PreferredFoot":"Left","ClubId":"100766","LeagueId":"67","NationId":"108","Rating":"78","Attribute1":"79","Attribute2":"71","Attribute3":"45","Attribute4":"69","Attribute5":"50","Attribute6":"72","Rare":"1","ItemType":"PlayerA"}}

基本的に、正しいヘッダーを送信するように設定する必要がありました。

皆さん、ありがとうございました

4

3 に答える 3

7

期待するエンコーディングをリクエストに伝える必要があります。

>>> import requests
>>> r = requests.get(url)
>>> r.encoding = 'UTF-8'
>>> r.json[u'Item'][u'LastName']
u'Traor\xe9'

それ以外の場合は、次のようになります。

>>> r = requests.get(url)
>>> r.json['Item']['LastName']
u'Traor\u0102\u0160'
于 2012-10-25T13:42:59.767 に答える
4

でバグに遭遇しましたrequests。サーバーが明示的なエンコーディングを設定しない場合、エンコーディングについて知識に基づいた推測を行うためにrequests使用します。chardet

この特定のケースでは、それが間違っています。の代わりchardetだと思います。この問題は、問題 765として管理者に報告されています。ISO-8859-2UTF-8requests

メンテナーはその問題をクローズし、サーバーの問題が応答の文字エンコーディングを設定していないと非難しました。回避策は、コンテンツが推測せずに正しくデコードされるように、r.encoding = 'utf-8'アクセスする前に設定することです。r.json

ただし、JF Sebastian が正しく指摘しているように、応答が実際JSON である場合、エンコーディングは UTF ファミリのエンコーディングの 1 つでなければなりません。JSON RFCには、使用されたエンコーディングを検出する方法に関するセクションも含まれています。

まさにそれを行うプロジェクトにプルリクエストを送信しました。requestsJSON でデコードされた応答を要求し、エンコーディングが設定されていない場合、推測ではなく、使用されている正しい UTF エンコーディングが検出されます。

このパッチを適用すると、エンコーディングを明示的に設定せずに URL が読み込まれます。

>>> import requests
>>> r = requests.get('http://cdn.content.easports.com/fifa/fltOnlineAssets/2013/fut/items/web/199074.json')
>>> r.json[u'Item'][u'LastName']
u'Traor\xe9'
>>> print r.json[u'Item'][u'LastName']
Traoré
于 2012-10-25T16:09:50.263 に答える
3

私にとって、あなたのサイトは返されます"Traor\u00e9"最後の文字は ですé):

r = requests.get(url)
print(json.dumps(json.loads(r.content)['Item']['LastName']))
# -> "Traor\u00e9" -> Traoré

r.json( r.text) は、ここで誤ったコンテンツを生成します。いずれかのサーバーまたはrequests両方が不適切なエンコードを使用しているため、"Traor\u0102\u0160". JSON テキストのエンコーディングはそのコンテンツによって完全に定義されるため、サーバーが送信するヘッダーが何であれ、json rfcからいつでもデコードできます。

JSON テキストは Unicode でエンコードする必要があります。デフォルトのエンコーディングは
UTF-8 です。

JSON テキストの最初の 2 文字は常に ASCII 文字 [RFC0020] であるため、オクテット
ストリームが UTF-8、UTF-16 (BE または LE)、または UTF-32 (BE または LE) であるかどうかを判別できます。
最初の 4 オクテットのヌルのパターンを調べます。

       00 00 00 xx  UTF-32BE
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8

この場合、先頭にゼロバイトがないr.contentためjson.loads動作します。それ以外の場合は、サーバーがContent-Typeヘッダーで誤った文字エンコーディングを送信するか、requestsバグを回避するために、手動で Unicode 文字列に変換する必要があります。

于 2012-10-25T12:52:14.500 に答える