<파이선 2의 한글 인코딩?
파이선2는 처음부터 유니코드를 지원하지 않았다가,
버전업이 되면서 지원을 시작해서 그런지, 한글을 사용하게 되면 인코딩에 문제가 발생한다.
우선 파이선 파일 내부에서 한글을 사용하기 위해서는
다음의 힌트를 소스코드 첫번째 또는 두번째 라인에 입력해야 한다.
# -*- coding: utf-8 -*- |
그렇지 않으면 파이선2는 기본적으로 ascii 인코딩을 사용하기 때문에 다음의 오류가 발생한다.
SyntaxError: Non-ASCII character '\xec' in file |
이렇게 오류가 발생하면 힌트를 입력해 주도록 하자.
# -*- coding: utf-8 -*- # str, unicode 형태에 대한 선언
# 출력 >> 한글
# 서로다른 타입에 대한 확인 >> <type 'str'>
# 리스트에 추가후 출력 >> ['\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00']
'''
'''
str_list.append(h2.encode('utf-8')) >> ['\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00', '\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00']
if h1 == h2.encode('utf-8'):
|
위와 같이 테스트를 해보면 파이선2는 str 타입과 unicode 타입이 따로 있음을 알 수 있다.
그리고 print 문에서는 알아서 형식을 바꿔서 출력해주지만,
리스트에 저장된 형식을 보면 str 과 unicode 는 저장된 형식이 다름을 알 수 있다.
문자열 형식을 비교할때도 str 과 unicode 형식을 바로 비교하면 다음의 오류가 발생한다.
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal |
그리고 ascii 형태의 문자열을 utf-8 로 인코딩 하려고 하면 다음의 오류가 발생한다.
UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128) |
비교연산은 위와 같이 유니코드 데이터를 utf-8 형식으로 인코딩 하던지, ascii 형태의 문자열을 utf-8로 디코드 해서 비교하면 된다.
리스트에 저장된 형식을 보면 알 수 있지만, 유니코드 형식의 한글을 utf-8 로 인코딩하면 ascii 형식으로 저장이 되고
ascii 형식의 한글을 utf-8로 디코드하면 유니코드 형식으로 저장이 된다.
* decode, encode 시에 'error' 파라미터를 지정할 수 있다.
# illegal multibyte sequence 오류 발생시 아래와 같이 입력 h2.encode('utf-8', 'replace'); h2.encode('utf-8', 'ignore'); |
위와 같이 파라미터를 입력하여 문자열 변환시 변환할 수 없는 문자열이 발생했을 때
해당 문자를 무시하고 지나갈지, 강제로 변환시킬지 지정할 수 있다.
The errors argument specifies the response when the input string can’t be converted according to the encoding’s rules. Legal values for this argument are ‘strict’ (raise a UnicodeDecodeError exception), ‘replace’ (add U+FFFD, ‘REPLACEMENT CHARACTER’), or ‘ignore’ (just leave the character out of the Unicode result). The following examples show the differences: |
'python' 카테고리의 다른 글
[python] subprocess 모듈을 이용한 명령어 실행 (1) | 2015.06.11 |
---|---|
파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴) (0) | 2015.02.09 |
[python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정 (0) | 2015.02.04 |
Python 에 한글 입력하기 (0) | 2015.01.09 |
문자열 포맷팅 (0) | 2014.12.24 |