파이썬2.x의 기본 인코딩은 ascii 이다. 파이썬 스크립트에서 한글을 사용하게 될 때 파이썬은 ascii 인코딩일 것으로 예상하고 해석하려고 하지만 한글을 ascii로 해석이 불가능 하기 때문에 SyntaxError가 발생 한다.
이 문제를 해결하기 위해 파이썬 파일의 최상단에는 아래와 같은 주석을 추가하면 조금 도움이 된다.
이 주석이 있으면 해당 파이썬 스크립트는 utf-8로 인코딩 되어 있다는 것을 미리 알려주는 역할을 한다.
여기서 잠깐 유니코드(unicode)와 utf-8에 대한 설명을 간단하게 하자면 utf-8은 유니코드를 위한 문자 인코딩 방식 중에 하나이다. utf-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지 사용한다고 한다.
다시 파이썬의 인코딩에 대한 부분으로 돌아가서 간단한 예제를 하나 보도록 하자.
위 예제 코드의 결과를 보면 쉽게 감을 잡을 수 있다.
첫번째 에제코드에서 상단에 내부 문자에 대한 인코딩을 utf-8로 하겠다는 미리 알려줬기 때문에(누구에게?? print에게!!) ‘한글’이라는 문자열의 타입은 확인해보면 string 이다. 그리고 u’한글’으로 하게 되면 유니코드로 잘 변환해서 출력 시켜주는 것을 알 수 있다.
두번째 예제에서는 상단에 선언한 부분을 제거하고 스크립트를 실행 시켜봤는데 역시나 문법에러(SyntaxError)가 발생 하는 것을 확인 할 수 있었다. ‘한글’을 기본적으로 ascii로 해석하려 하기 때문에 type을 알 수도 없고, 유니코드로 변환도 할 수 없는 것이다.
‘한글’을 유니코드로 변환하고, 그 유니코드를 다시 문자열로 바꿔서 출력하려고 한다.
이 코드는 결과는 무엇일까?
unicode() 기본적으로 전달된 인자값을 ascii로 해석하려고 하기 때문에 위 예제는 아래와 같은 에러가 발생한다.
결국 상단에 utf-8을 사용할 것이라고 선언했어도 unicode() 함수를 사용할때는 소용없다는 것을 알게 되었다.
이 코드를 정상적으로 동작하도록 해보자.
정신 건강을 위해서라도 파이썬 스크립트 내부에서 사용하는 모든 문자열은 유니코드로 다루는 것이 좋겠다.
그리고 파일이나 DB에 저장하거나 네트워크로 전송하기 직전에는 string으로 변환해서 넘겨주는 방식으로 개발하는 것이 좋다…
아! 그리고 ‘유니코드가 아닌 상태로 CJK(Chinese. Japanese, Korean) 비교할 때 주의할 점’(https://gist.github.com/kimdwkimdw/a2ea13848167984adc8f)도 참고하고 숙지해서 개발시에 엉뚱한 삽질은 안하도록 하자!
이 문제를 해결하기 위해 파이썬 파일의 최상단에는 아래와 같은 주석을 추가하면 조금 도움이 된다.
#-*- coding: utf-8 -*-
이 주석이 있으면 해당 파이썬 스크립트는 utf-8로 인코딩 되어 있다는 것을 미리 알려주는 역할을 한다.
여기서 잠깐 유니코드(unicode)와 utf-8에 대한 설명을 간단하게 하자면 utf-8은 유니코드를 위한 문자 인코딩 방식 중에 하나이다. utf-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지 사용한다고 한다.
다시 파이썬의 인코딩에 대한 부분으로 돌아가서 간단한 예제를 하나 보도록 하자.
# -*- coding: utf8 -*- print(type('한글').__name__) # str print(type(u'한글').__name__) # unicode
print(type('한글').__name__) print(type(u'한글').__name__) SyntaxError: Non-ASCII character '\xed' in file…블라블라~
위 예제 코드의 결과를 보면 쉽게 감을 잡을 수 있다.
첫번째 에제코드에서 상단에 내부 문자에 대한 인코딩을 utf-8로 하겠다는 미리 알려줬기 때문에(누구에게?? print에게!!) ‘한글’이라는 문자열의 타입은 확인해보면 string 이다. 그리고 u’한글’으로 하게 되면 유니코드로 잘 변환해서 출력 시켜주는 것을 알 수 있다.
두번째 예제에서는 상단에 선언한 부분을 제거하고 스크립트를 실행 시켜봤는데 역시나 문법에러(SyntaxError)가 발생 하는 것을 확인 할 수 있었다. ‘한글’을 기본적으로 ascii로 해석하려 하기 때문에 type을 알 수도 없고, 유니코드로 변환도 할 수 없는 것이다.
# -*- coding: utf8 -*- print str(unicode('한글')) print str(unicode(‘한글', ‘utf-8'))
‘한글’을 유니코드로 변환하고, 그 유니코드를 다시 문자열로 바꿔서 출력하려고 한다.
이 코드는 결과는 무엇일까?
unicode() 기본적으로 전달된 인자값을 ascii로 해석하려고 하기 때문에 위 예제는 아래와 같은 에러가 발생한다.
UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)
결국 상단에 utf-8을 사용할 것이라고 선언했어도 unicode() 함수를 사용할때는 소용없다는 것을 알게 되었다.
이 코드를 정상적으로 동작하도록 해보자.
# -*- coding: utf8 -*- # 유니코드로 다루기 예제1 hoo = unicode('한글', 'utf-8') print str(hoo.encode('utf-8')) # 유니코드로 다루기 예제2 bar = '한글'.decode('utf-8') print bar.encode('utf-8') # 유니코드로 다루기 예제3 foo = u'한글' print str(foo.encode('utf-8'))
정신 건강을 위해서라도 파이썬 스크립트 내부에서 사용하는 모든 문자열은 유니코드로 다루는 것이 좋겠다.
그리고 파일이나 DB에 저장하거나 네트워크로 전송하기 직전에는 string으로 변환해서 넘겨주는 방식으로 개발하는 것이 좋다…
아! 그리고 ‘유니코드가 아닌 상태로 CJK(Chinese. Japanese, Korean) 비교할 때 주의할 점’(https://gist.github.com/kimdwkimdw/a2ea13848167984adc8f)도 참고하고 숙지해서 개발시에 엉뚱한 삽질은 안하도록 하자!
참고 자료
- http://ko.wikipedia.org/wiki/UTF-8
- http://libsora.so/posts/python-hangul/
- http://seorenn.blogspot.kr/2011/02/python-unicodeutf-8.html
- http://www.slideshare.net/LeeSeongjoo/2-17395073
- http://amornatura.tistory.com/104
- http://www.lug.or.kr/m/bbs/view.php?bo_table=python&wr_id=68&page=1