python 중국어 인 코딩 과 json 중국어 출력 문제 상세 설명

머리말
python 2.x 버 전의 문자 인 코딩 은 때때로 사람 을 골 치 아 프 게 한다.문제 가 발생 하면 인터넷 방법 으로 오 류 를 해결 할 수 있 지만 원리 에 대해 서 는 수박 겉 핥 기 식 이다.본 고 는 주로 python 에서 문자열 처리 의 원 리 를 소개 하고 json 파일 출력 을 추가 로 해결 할 때 유 니 코드 문제 가 아 닌 중국 어 를 보 여 준다.먼저 문자열 인 코딩 의 역 사 를 간략하게 소개 하고,그 다음 에 python 이 문자열 에 대한 처리 와 인 코딩 의 검 측 과 변환 을 설명 하 며,마지막 으로 python 파충류 가 채택 한 json 데이터 가 파일 에 저 장 될 때 중국어 출력 문 제 를 소개 합 니 다.
파 이 썬 인터넷 파충류 입문 부터 실천 까지 by 당 송
python 2 또는 3 에서 문자열 인 코딩 은 두 가지 종류 만 있 습 니 다.
(1)일반적인 유 니 코드 인 코딩;
(2)UTF-8,GBK 와 같은 유 니 코드 를 특정한 유형의 인 코딩 으로 전환 합 니 다.
1.컴퓨터 역사:
컴퓨터 는 숫자 만 처리 하기 때문에 텍스트 를 처리 할 때 반드시 숫자 로 변환 해 야 한다.
8 비트(bit)=1 바이트(byte)=256 가지 다른 상태=000000 에서 111111;
1GB=1024M=1024(1024kb)=1024(1024(1024b));
ASCII 인 코딩 은 영문 문자 와 바 이 너 리 숫자 사이 의 관계 입 니 다.ASCII 는 모두 128 종 을 규정 했다.예 를 들 어 대문자 A 는 65,즉 010000001 이다.알파벳 일자 바이트 보이 기;
GB 2312 인 코딩 간 체 중국어 에서 흔히 볼 수 있 는 인 코딩 은 두 바이트 가 하나의 중국어 한 자 를 대표 하고 이론 적 으로 256*256 개의 인 코딩 을 하면 65536 가지 중문 자 를 나 타 낼 수 있다.
각국 의 인 코딩 이 다 르 기 때문에 각국 이 플랫폼 을 확대 하여 텍스트 의 전환 과 처 리 를 할 수 있 도록 유 니 코드 는 통일 코드 나 단일 코드 로 여 겨 진다.유 니 코드 인 코딩 은 보통 두 바이트 입 니 다.유 니 코드 와 ASCII 인 코딩 의 차 이 는 유 니 코드 가 ASCII 인 코딩 전에 0 을 추가 한 것 입 니 다.즉,알파벳 A 의 ASCII 인 코딩 은 01000001 이 고 유 니 코드 인 코딩 은 0000001000001 입 니 다.그러나 영문 자 모 는 한 바이트 만 사용 하면 충분 하 다.유 니 코드 인 코딩 으로 영 어 를 쓸 때 한 바이트 가 더 많아 져 저장 공간 을 낭비 했다.따라서 유 니 코드 는 유 니 버 설 변환 형식(유 니 코드 Transformation Format(UTF)을 개 발 했 는데 흔히 볼 수 있 는 것 은 utf-8 또는 utf-16 이다.
encode()와 decode()의 차 이 를 알 아야 합 니 다.
encode()는 유 니 코드 인 코딩 문자열 을 다른 인 코딩 형식 으로 변환 하 는 역할 을 합 니 다.
예 를 들 어 st1.encode("utf-8") 이 말 은 유 니 코드 인 코딩 의 st1 을 utf-8 인 코딩 문자열 로 인 코딩 하 는 역할 을 합 니 다.
decode()는 다른 인 코딩 형식의 문자열 을 유 니 코드 인 코딩 문자열 로 변환 하 는 역할 을 합 니 다.
예 를 들 어 st2.decode("utf-8") 이 말의 역할 은 utf-8 인 코딩 문자열 st2 를 유 니 코드 인 코딩 문자열 로 디 코딩 하 는 것 입 니 다.
둘째,유 니 코드 인 코딩 문자열 을 제외 한 인 코딩 문자열 을 다른 인 코딩 형식 으로 바 꾸 려 면 먼저 디 코딩 한 다음 인 코딩 해 야 합 니 다.
비 유 니 코드 인 코딩-->유 니 코드 인 코딩-->비 유 니 코드 인 코딩
예 를 들 어 utf-8 인 코딩 문자열 st 를 gbk 인 코딩 문자열 로 변환 하려 면 다음 절 차 를 거 쳐 야 합 니 다.

st=st.decode("utf-8") #   Unicode  
st=st.encode("gbk") # Unicode     gbk  
셋째,우리 가 자주 사용 하 는 utf-8 인 코딩 은 BOM 이 있 는 것 과 BOM 이 없 는 것 으로 나 뉜 다.
넷 째:제 이 슨 파일 에 대한 중국어 인 코딩.Python 으로 JSon 파일 을 읽 을 때 json.load()함 수 를 자주 사용 합 니 다.이 함 수 는 json 파일 의 형식 에 대한 요구 가 있 습 니 다.
1)제 이 슨 파일 은 utf-8 without BOM 인 코딩 으로 제 이 슨 파일 의 내용 을 json.load(filename) 함수 로 직접 읽 을 수 있 습 니 다.
2)json 파일 은 utf-8 with BOM 인 코딩 으로 json.load() 함수 로 읽 을 수 없고 json.load() 은 정확하게 식별 할 수 없습니다.
3)제 이 슨 파일 시 다른 인 코딩,예 를 들 어 gbk 는 제 이 슨 파일 의 인 코딩 형식 을 하나의 매개 변수 로 json.load() 에 전달 해 야 합 니 다.

eg. json.load(filename,"gbk")
다섯 째,자신의 파일 의 인 코딩 을 어떻게 보고 설정 합 니까?
개인 적 으로 좋아 하 는 도구 인'Nodtepad+'를 소개 합 니 다.아무 소프트웨어 관리자 나 원 키 로 설치 합 니 다.
이 도 구 를 사용 하면 파일 의 현재 인 코딩 을 편리 하 게 볼 수 있 고 다른 인 코딩 형식 으로 쉽게 변환 할 수 있 습 니 다.
2,python 문자 인 코딩
참고 주소:https://www.jb51.net/article/139878.htm
(1)encode 의 역할 은 유 니 코드 대상 을 다른 인 코딩 문자열 로 인 코딩 하고 str.encode(utf-8)를 UTF-8 로 인 코딩 하 는 것 입 니 다.(2)decode 는 다른 인 코딩 문자열 을 유 니 코드 인 코딩,str.decode('UTF-8')로 변환 하 는 역할 을 합 니 다.
  • import chardet 는 구체 적 인 인 인 코딩 형식 인 chardet.detect(str)를 찾 아 보 았 으 나 str 는 유 니 코드 인 코딩 형식 이 아 닙 니 다.그러나 이 방법 은 원래 유 니 코드 인 코딩 된 인 자 를 받 아들 이지 않 고 TypeError:Expected object of type bytes or by tearray,got:오류 가 있 습 니 다.
  • 은 통일 기준 으로 유 니 코드 를 더 이상 디 코딩 할 수 없습니다.UTF-8 이 다른 비 유 니 코드 로 전환 하려 면(2)먼저 decode 에서 유 니 코드 로,encode 에서 다른 비 유 니 코드 로 인 코딩 해 야 합 니 다.
  • 웹 페이지 를 찾 을 때 F12 elements meta 에서 웹 페이지 인 코딩 방식 을 볼 수 있 습 니 다.그림:

    (2)중국어,Python 의 사전 은 json 파일 에 json 으로 정렬 하여 저장 할 수 있 습 니 다.
    
    with open("anjuke_salehouse.json","w",encoding='utf-8') as f:
     json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4);
     print(u'       ...');
    그림 과 같이 데이터 저장:
  • dump()의 첫 번 째 매개 변 수 는 직렬 화 대상 이 고 두 번 째 매개 변 수 는 열 린 파일 핸들 입 니 다.파일 이 open()을 열 때 UTF-8 인 코딩 으로 열 리 는 것 을 주의 하 십시오.dump()에 도 ensure 를 추가 합 니 다.ascii=False,그렇지 않 으 면 ascii 코드 가 json 파일 에 json.dump(allhouse,f,ensure_ascii=False,sort_keys=True, indent=4)
  • json.dumps()/json.loads()등 용법
    
    json_str = json.dumps(all_house,ensure_ascii=False); #all――books    、   python       ,    json
    #print json_str; #[{"brokername": "   "},{},{}]
    new_dict = json.loads(json_str);#    json   ,    
    #print new_dict; #{u'house_area': u'95', u'build_year': u'2005'}
  • json.dumps()는 Python 데이터 구 조 를 JSON 인 코딩 으로 변환 하 는 문자열 입 니 다.
  • {"name": "xiaoming"}

    json.loads()는 JSON 인 코딩 문자열(사전 형식)을 Python 데이터 구조 로 변환 합 니 다.{u'name':u'xiaoming'}

    dumps 전환 후 키 와 값 은 모두 작은 따옴표 가 되 었 고 loads 후 python 변수 가 되 었 을 때 요 소 는 작은 따옴표 가 되 었 으 며 문자열 앞 에 u 를 추가 하 였 습 니 다.
    일반적으로 문자열 이 loads 를 통 해 python 데이터 형식 으로 바 뀌 려 면 외부 에 작은 따옴표,안에 있 는 요소 key 와 value 는 작은 따옴표 로 해 야 합 니 다.
  • sort_keys:key 정렬 에 따라
  • dump 와 dumps 의 차이
  • dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw); dump 는 하나의 대상 을 파일 에 직렬 화하 여 저장 합 니 다.dump 는 파일 포인터 와 유사 한 인자(실제 포인터 가 아니 라 클래스 파일 대상 이 라 고 할 수 있 습 니 다)가 필요 합 니 다.즉,dict 를 str 로 변환 하여 파일 에 저장 할 수 있 습 니 다.예 를 들 어 json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4) 의 f 는 데 이 터 를 기록 할 json 파일 핸들 을 표시 합 니 다.
  • dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw); dumps(str) 은 str 를 직접 주 었 습 니 다.즉,사전 을 str 로 직접 바 꾸 는 것 입 니 다.파일 을 쓸 필요 가 없습니다.데이터 형식 과 같은 변환 방법 으로 python 문자열 을 json 사전 으로 바 꾸 는 것 입 니 다.
  • 그래서 dumps 는 dict 를 str 형식 으로 바 꾸 고 loads 는 str 를 dict 형식 으로 바 꿉 니 다.
    dump 와 load 도 비슷 한 기능 으로 파일 작업 과 결합 되 었 습 니 다.
  • (3)중국어 txt 저장
    
    f=open('net_saving_data.txt','w',encoding='utf-8');
    for item in all_house:
     # house_area=item['house_area'];
     # price=item['price'];
     output='\t'.join([str(item['house_area']),str(item['price']),str(item['build_year']),str(item['house_title'])]);
     f.write(output);
     f.write('
    '); f.close();
  • 은 2.7.15 버 전의 python 에서 오류 TypeError:'encoding'is an invalid keyword argument for this function 을 알려 줍 니 다.encoding 의 인 자 를 입력 할 수 없 지만 3.7 버 전에 서 는 encoding='utf-8'인 자 를 입력 하면 txt 를 중국어 로 기록 할 수 있 습 니 다.
  • !!NOTE
  • 중국어 로 txt,json 파일 이 open()파일 일 때 utf-8,dump()를 추가 해 야 할 때 ensure 를 추가 해 야 합 니 다.ascii=False,ascii 인 코딩 을 방지 하지만 처음에는 python 버 전이 2.7.15 로 3.7 이 아니 라 저장 이 성공 하지 못 했 을 때 코드 문제 인 줄 알 았 습 니 다.그래서 최종 적 으로 버 전의 문제 라 는 것 을 알 게 되 었 고 매우 상 처 를 입 었 다.인터넷 에서 중국어 에 관 한 이 인 코딩 문 제 는 매우 많 지만,그들 은 모두 python 버 전의 문 제 를 강조 하지 않 았 습 니 다!!다른 3.xx 버 전 은 해 본 적 이 없습니다.
  • 웹 페이지 데 이 터 를 읽 을 때 웹 페이지 의 charset 와 chardet 라 이브 러 리 에서 인 코딩 유형 에 대한 조 회 를 보고 decode 와 encode 의 인 코딩 전환 을 실시 하면 많은 인 코딩 문 제 를 피 할 수 있 을 것 입 니 다.다른 구 덩이 는 나중에 밟 아서 고 쳐 라.
  • 총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기