[PYTHON] json.dumps ()를 사용하는 동안 UnicodeDecodeError [duplicate]
PYTHONjson.dumps ()를 사용하는 동안 UnicodeDecodeError [duplicate]
내 파이썬 목록 (명령 프롬프트에서 가져온) 다음과 같은 문자열이 있습니다 :
>>> o['records'][5790]
(5790, 'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ', 60,
True, '40141613')
>>>
여기에 언급 된대로 제안을 시도했습니다 : 파이썬의 기본 인코딩 변경?
기본 인코딩을 utf-16으로 변경했습니다. 하지만 여전히 json.dumps ()는 다음과 같이 예외를 던집니다.
>>> write(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "okapi_create_master.py", line 49, in write
o = json.dumps(output)
File "C:\Python27\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python27\lib\json\encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 25: invalid
continuation byte
json.dumps ()가 작동하도록 이러한 문자열에 어떤 종류의 변환이 필요한지 알 수 없습니다.
해결법
-
==============================
1.\ xe1은 utf-8, utf-16 인코딩을 사용하여 디코딩 할 수 없습니다.
\ xe1은 utf-8, utf-16 인코딩을 사용하여 디코딩 할 수 없습니다.
>>> '\xe1'.decode('utf-8') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 0: unexpected end of data >>> '\xe1'.decode('utf-16') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode return codecs.utf_16_decode(input, errors, True) UnicodeDecodeError: 'utf16' codec can't decode byte 0xe1 in position 0: truncated data
라틴 -1 인코딩 시도 :
>>> record = (5790, 'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ', ... 60, True, '40141613') >>> json.dumps(record, encoding='latin1') '[5790, "Vlv-Gate-Assy-Mdl-\\u00e1M1-2-\\u00e19/16-10K-BB Credit Memo ", 60, true, "40141613"]'
또는, ensure_ascii = False, json.dumps를 지정하여 json.dumps가 문자열 디코딩을 시도하지 않도록하십시오.
>>> json.dumps(record, ensure_ascii=False) '[5790, "Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ", 60, true, "40141613"]'
-
==============================
2.나는 비슷한 문제가 있었고 두 입력 중 하나에서 유니 코드 또는 바이트 문자열을 보장하기 위해 다음과 같은 접근법을 제안했습니다. 즉, 다음 람다를 포함시키고 사용하십시오 :
나는 비슷한 문제가 있었고 두 입력 중 하나에서 유니 코드 또는 바이트 문자열을 보장하기 위해 다음과 같은 접근법을 제안했습니다. 즉, 다음 람다를 포함시키고 사용하십시오 :
# guarantee unicode string _u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t _uu = lambda *tt: tuple(_u(t) for t in tt) # guarantee byte string in UTF8 encoding _u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t _uu8 = lambda *tt: tuple(_u8(t) for t in tt)
귀하의 질문에 적용 :
import json o = (5790, u"Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ", 60, True, '40141613') as_json = json.dumps(_uu8(*o)) as_obj = json.loads(as_json) print "object\n ", o print "json (type %s)\n %s " % (type(as_json), as_json) print "object again\n ", as_obj
=>
object (5790, u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ', 60, True, '40141613') json (type <type 'str'>) [5790, "Vlv-Gate-Assy-Mdl-\u00e1M1-2-\u00e19/16-10K-BB Credit Memo ", 60, true, "40141613"] object again [5790, u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ', 60, True, u'40141613']
이것에 대해 더 많은 추론이 있습니다.
from https://stackoverflow.com/questions/19872773/unicodedecodeerror-while-using-json-dumps by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] PyChObject는 PyGObject 3.0을 해결할 수 없지만 코드는 정상적으로 실행됩니다. (0) | 2018.10.31 |
---|---|
[PYTHON] MATLAB 에서처럼 IPython에서 세션을 저장 하시겠습니까? (0) | 2018.10.31 |
[PYTHON] 내적을 계산하는 파이썬적인 방법은 무엇입니까? (0) | 2018.10.31 |
[PYTHON] 팬더는 열을 가로 질러 합계를하고 그 값에서 각 셀을 나눕니다. (0) | 2018.10.31 |
[PYTHON] Django의 CSRF 유효성 검사를 비활성화하는 방법은 무엇입니까? (0) | 2018.10.31 |