python object options - json.dumps에 utf-8 텍스트를 UTF8로 저장하고 이스케이프 시퀀스로 저장하지 않습니다.





4 Answers

케이크처럼 쉽다.

파일에 쓰려면

import codecs
import json

with codecs.open('your_file.txt', 'w', encoding='utf-8') as f:
    json.dump({"message":"xin chào việt nam"}, f, ensure_ascii=False)

stdin으로 인쇄하려면

import codecs
import json
print(json.dumps({"message":"xin chào việt nam"}, ensure_ascii=False))
arguments encode error

샘플 코드 :

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

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

\ uXXXX 대신 utf-8 json 문자열로 객체를 직렬화하는 방법이 있습니까?

이 도움이되지 않습니다 :

>>> output = json_string.decode('string-escape')
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

작품은,하지만 어떤 하위 개체는 파이썬 유니 코드 및 utf - 8 아니라면 쓰레기를 버릴거야 :

>>> #### ok:
>>> s= json.dumps( "ברי צקלה", ensure_ascii=False)    
>>> print json.loads(s)   
ברי צקלה

>>> #### NOT ok:
>>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
>>> print d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 
 2: u'\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94'}
>>> s = json.dumps( d, ensure_ascii=False, encoding='utf8')
>>> print json.loads(s)['1']
ברי צקלה
>>> print json.loads(s)['2']
××¨× ×¦×§××



Peters 'python 2 해결 방법은 딱딱한 상황에서 실패합니다.

d = {u'keyword': u'bad credit  \xe7redit cards'}
with io.open('filename', 'w', encoding='utf8') as json_file:
    data = json.dumps(d, ensure_ascii=False).decode('utf8')
    try:
        json_file.write(data)
    except TypeError:
        # Decode data to Unicode first
        json_file.write(data.decode('utf8'))

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 25: ordinal not in range(128)

3 행의 .decode ( 'utf8') 부분에서 충돌이 발생했습니다. 나는 ascii의 특별한 케이스뿐만 아니라 그 단계를 피함으로써 프로그램을 훨씬 단순하게 만들어 문제를 해결했습니다 :

with io.open('filename', 'w', encoding='utf8') as json_file:
  data = json.dumps(d, ensure_ascii=False, encoding='utf8')
  json_file.write(unicode(data))

cat filename
{"keyword": "bad credit  çredit cards"}



다음은 json.dump ()를 사용하여 작성한 솔루션입니다.

def jsonWrite(p, pyobj, ensure_ascii=False, encoding=SYSTEM_ENCODING, **kwargs):
    with codecs.open(p, 'wb', 'utf_8') as fileobj:
        json.dump(pyobj, fileobj, ensure_ascii=ensure_ascii,encoding=encoding, **kwargs)

여기서 SYSTEM_ENCODING은 다음으로 설정됩니다.

locale.setlocale(locale.LC_ALL, '')
SYSTEM_ENCODING = locale.getlocale()[1]



json.dumps에서 ensure_ascii = False를 사용하면 Martijn이 지적한대로이 문제를 해결할 수있는 올바른 방향입니다. 그러나 이로 인해 예외가 발생할 수 있습니다.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 1: ordinal not in range(128)

site.py 또는 sitecustomize.py에서 sys.getdefaultencoding ()을 올바르게 설정하려면 추가 설정이 필요합니다. site.py는 lib / python2.7 /에 있으며 sitecustomize.py는 lib / python2.7 / site-packages에 있습니다.

defsetencoding ()에서 site.py를 사용하려면 : 0 : 1 인 경우 첫 번째를 1 : 1로 변경하여 파이썬이 운영 체제의 로켈을 사용하도록합니다.

sitecustomize.py를 선호한다면, 만들지 않은 경우 존재하지 않을 수도 있습니다. 단순히 다음 줄을 넣으십시오.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

다음과 같이 utf-8 형식의 중국어 json 출력을 수행 할 수 있습니다.

name = {"last_name": u"王"}
json.dumps(name, ensure_ascii=False)

\ n 이스케이프 된 json 문자열 대신 utf-8로 인코딩 된 문자열을 얻습니다.

기본 인코딩을 확인하려면 다음 단계를 따르세요.

print sys.getdefaultencoding()

site.py 또는 sitecustomize.py 설정을 확인하려면 "utf-8"또는 "UTF-8"이 있어야합니다.

대화 형 Python 콘솔에서는 sys.setdefaultencoding ( "utf-8")을 할 수 없다는 점에 유의하십시오.






Related