2017-10-24 4 views
0

Python3을 사용하여 터미널에 원시 JSON 데이터를 표시하는 데 문제가 있습니다. 나는 URLLIB의 응답으로 JSON을 얻을 :아스키 문자가 아닌 원시 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는 유니 코드 코드 포인트되지 않는 것입니다.

>>> 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을 확인하십시오. 예를 들어
: 유효한 JSON 문자열 응답이 정말 경우

>>> 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

, 그것은 문자열 큰 따옴표가 있어야하고,이 경우 유니 코드 코드 포인트와 완전히 ASCII 응답입니다 JSON 이스케이프 코드로 표시됩니다. json 모듈을 사용하여 디코딩 할 수 있습니다. 이 목록 및 키/값 쌍을 포함,뿐만 아니라 훨씬 더 복잡한 JSON 응답을 처리합니다 :

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

또한 당신을 위해 JSON을 디코딩 할 requests 모듈 (제 3 자), 들여다 :

>>> 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을 디코딩 할 필요는 없지만 파이썬 dict로 구문 분석되지 않은 그대로 원시를 표시하려면 큰 따옴표와 원래 순서가 필요합니다. 그러나 당신의 도움에 감사드립니다. –

관련 문제