2017-10-24 17 views
0

Python3を使用して端末に生のJSONデータを表示する際に問題があります。私はurllibはからの応答としてJSONを取得する:ASCII以外の文字で未加工のJSONを表示

r = urlopen(request) 
response = r.read() 

結果は私にこの"Chybné heslo"を与える必要がありますb"Chybn\\u00e9 heslo"のような非ASCII文字が含まれてその一部をバイト列b"..."、です。

しかし、私は、私がしなければ、それは、"Chybné heslo"を表示するためにデコードする方法がわからない:私はちょうど"Chybn\u00e9 heslo"を得る

print(b"Chybn\\u00e9 heslo".decode('utf-8')) 

。私はここで間違って何をしていますか?

答えて

1

使用unicode-escapeコーデック:

byte_str = b"Chybn\u00e9 heslo" 
print(byte_str.decode('unicode-escape')) # Chybné heslo 

問題の理由は、バイト文字列に\u00e9は、Unicodeのコードポイントではないということです。
それは単なるバイトのシーケンスです:

>>> len(b'\u00e9') # whereas len('\u00e9') == 1 
6 

>>> [b for b in b'\u00e9'] 
[92, 117, 48, 48, 101, 57] 

は、これらのバイトは、あなたがこのエンコーディングでそれらをデコードするときに、あなたが文字の対応するシーケンスを取得し、また、UTF-8バイト以下のとおりです。

>>> b'\u00e9'.decode('utf-8') 
'\\u00e9' 

>>> [chr(b) for b in b'\u00e9'] # decoding in 'byte-by-byte' mode 
['\\', 'u', '0', '0', 'e', '9'] 

\\\は一部の文字列では同等です(詳細は、詳細はthisを参照してください)。たとえば

>>> b'\\u' == b'\u' 
True 
>>> b'\\u00e9' == b'\u00e9' 
True 
>>> b'\\n' == b'\n' 
False 

>>> '\\u00e9' == '\u00e9' 
False 

>>> '\\z' == '\z' 
True 
+0

ありがとうございました!それがまさに私が必要としていたものです。詳細な説明にも感謝します。 –

+0

@RayP、よろしいですか?喜んで助けてください。 – MaximTitarenko

1

それは本当に有効なJSON文字列の応答である場合、それは文字列の周りに二重引用符を持っており、それする必要があり、この場合は、Unicodeコードポイントと完全にASCII応答でありますJSONエスケープコードとして表されます。 jsonモジュールを使用してデコードすることができます。これは、リストや、キー/値のペアを含む、同様にはるかに複雑なJSON応答を処理します:

>>> import json 
>>> json.loads(b'"Chybn\\u00e9 heslo"') 
'Chybné heslo' 

また、あなたのためにJSONをデコードしますrequestsモジュール(サードパーティ)、に見て:

>>> import requests 
>>> r = requests.get('http://date.jsontest.com') 
>>> r.text 
'{\n "time": "06:58:22 AM",\n "milliseconds_since_epoch": 1508914702539,\n "date": "10-25-2017"\n}\n' 
>>> r.json() 
{'time': '06:58:22 AM', 'milliseconds_since_epoch': 1508914702539, 'date': '10-25-2017'} 
>>> D = r.json() 
>>> D['time'] 
'06:58:22 AM' 
+0

問題は、私はjsonをデコードする必要はありませんでしたが、Python dictとして解析されずそのままそのまま表示するために、二重引用符と元の順序で表示しました。しかし、助けてくれてありがとう。 –

関連する問題