프로그래밍 언어/Python

json.dumps가있는 utf-8 텍스트를 \u 이스케이프 시퀀스가 아닌 UTF8로 저장하는 방법

Rateye 2021. 9. 30. 10:37
728x90
반응형
질문 : json.dumps가있는 utf-8 텍스트를 \ u 이스케이프 시퀀스가 아닌 UTF8로 저장

샘플 코드 :

>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print(json_string)
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

문제는 사람이 읽을 수 없다는 것입니다. 내 (스마트 한) 사용자는 JSON 덤프로 텍스트 파일을 확인하거나 편집하기를 원합니다 (그리고 XML을 사용하지 않을 것입니다).

객체를 UTF-8 JSON 문자열로 직렬화하는 방법이 있습니까 ( \uXXXX

답변

ensure_ascii=False 스위치를 json.dumps() 로 사용하고 값을 수동으로 UTF-8로 인코딩합니다.

>>> json_string = json.dumps("ברי צקלה", ensure_ascii=False).encode('utf8')
>>> json_string
b'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
>>> print(json_string.decode())
"ברי צקלה"

파일에 쓰는 경우 json.dump() 사용하고 인코딩 할 파일 객체에 그대로 둡니다.

with open('filename', 'w', encoding='utf8') as json_file:
    json.dump("ברי צקלה", json_file, ensure_ascii=False)
    

Python 2에 대한주의 사항

Python 2의 경우 고려해야 할 몇 가지주의 사항이 더 있습니다. 이것을 파일에 쓰는 경우 open() () 대신 io.open() 사용하여 작성하는 동안 유니 코드 값을 인코딩하는 파일 객체를 생성 한 다음 해당 파일에 쓰는 대신 json.dump() :

with io.open('filename', 'w', encoding='utf8') as json_file:
    json.dump(u"ברי צקלה", json_file, ensure_ascii=False)

ensure_ascii=False 플래그가 unicodestr 객체의 혼합 을 생성 할 수 json 모듈에 버그가 있습니다. Python 2의 해결 방법은 다음과 같습니다.

with io.open('filename', 'w', encoding='utf8') as json_file:
    data = json.dumps(u"ברי צקלה", ensure_ascii=False)
    # unicode(data) auto-decodes data to unicode if str
    json_file.write(unicode(data))

Python 2에서 UTF-8로 인코딩 된 바이트 문자열 (유형 str encoding 키워드도 설정해야합니다.

>>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
>>> d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}

>>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
>>> s
u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
>>> json.loads(s)['1']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> json.loads(s)['2']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> print json.loads(s)['1']
ברי צקלה
>>> print json.loads(s)['2']
ברי צקלה
출처 : https://stackoverflow.com/questions/18337407/saving-utf-8-texts-with-json-dumps-as-utf8-not-as-u-escape-sequence
728x90
반응형