본문 바로가기
IT & 코딩

Python 한글 인코딩 해결하기

by 에일라거 2016. 3. 2.

Python 2


어제 파싱하다가 한참 안돼서... 여기저기 뒤지다가 해결한 세가지 방법 메모


1. 파일의 맨 위에 주석 삽입

#-*- coding:utf-8 -*-


아래에 나오는 모든 문자열이 UTF-8 형식이라는 것을 명시하는 코드


2. UNICODE로 디코딩 후 다시 인코딩

파이썬의 문자열 인식 방법은 기본적으로 Unicode라고 하니, 문자열을 decode 하는 것은 어떤 특정 인코딩(cp949, iso-8859-1, utf-8 등등) 에서 unicode로 환원하는 것이고, encode 하는 것은 Unicode 문자열을 특정 방식으로 인코딩하는 것임. 어딘가에서 파싱한 한글 문자열 a 에서 한글로 검색을 했는데 죽어도 안 찾아진다... 이러면 검색할 때의 인코딩과 문자열 인코딩이 달라서 그런 것으로, 해당 인코딩을 Unicode로 디코딩한 후에 다시 인코딩해야 함.


a = a.decode('cp949').encode('utf-8')


이러면 a라는 cp949 방식으로 인코딩된 문자열을 Unicode로 디코딩한 후에 utf-8로 다시 인코딩해 줌. 어제 이거 몰라서 죽을 뻔 했네...

그래서 파싱한 원래 문자열의 인코딩 방식을 알아야 하는데, 대체로 한글 문자열인데 뭐가 안된다.. 싶으면 보통 cp949 인코딩 사용할 가능성 농후함.

 

Unicode로 디코딩한 상태로 그대로 써도 되는데 나는 utf-8을 선호해서...


3. 외부 라이브러리의 기본 인코딩 방식 설정

파일의 맨 위에 주석을 삽입하는 것이 좋긴 하나... 외부에서 불러온 라이브러리 각 파일에 모두 그짓을 할 수가 없으므로 아래 코드를 써 주면 그와 똑같이 동작함.


import sys

reload(sys)

sys.setdefaultencoding('utf-8')



위 세가지를 조합해 보면, 일단 파일 맨 위에다가 아래와 같이 집어넣고 시작함.


#-*- coding:utf-8 -*-


import sys

reload(sys)

sys.setdefaultencoding('utf-8')


그리고 코드 중간중간에 외부에서 긁어온 한글 문자열 같은 게 말을 안 듣는다... 싶으면 해당 문자열 인코딩을 알아내서


a = a.decode('***').encode('utf-8')


라고 변환해 주면 됨. *** 부분은 한글 문자열의 경우는 보통 cp949임.


Python 3

파이썬 3에서는 위 방법 중 2번이 (import sys) 안 먹힌다.


1. 주석 명시

이건 그냥 기본적으로 해 줌

#-*- coding:utf-8 -*-


2. 외부에서 긁은 텍스트 (크롤링 등)

decode() / encode() 또는 크롤링 시 사용한 라이브러리의 인코딩 관련 자체 함수 이용


3. 파일 입출력

읽기 : f = open('c:\xxx\xx.txt', 'rt', encoding='utf-8')

쓰기 : f = open('c:\xxx\xx.txt', 'wt', encoding='utf-8')


* 보통 파일 읽고 쓸 때 옵션을 r 이나 w 로 주는데 그게 아니라 rt, wt로 주고 인코딩 명시하면 됨.

댓글