본문 바로가기
python

[파이선2] 파이선2의 한글 인코딩 비교하기

by hs_seo 2015. 1. 12.

<파이선 2의 한글 인코딩?

 

파이선2는 처음부터 유니코드를 지원하지 않았다가,
버전업이 되면서 지원을 시작해서 그런지, 한글을 사용하게 되면 인코딩에 문제가 발생한다.


우선 파이선 파일 내부에서 한글을 사용하기 위해서는
다음의 힌트를 소스코드 첫번째 또는 두번째 라인에 입력해야 한다.

 

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

 

그렇지 않으면 파이선2는 기본적으로 ascii 인코딩을 사용하기 때문에 다음의 오류가 발생한다.

 

SyntaxError: Non-ASCII character '\xec' in file 

 

이렇게 오류가 발생하면 힌트를 입력해 주도록 하자.

 

 

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

# str, unicode 형태에 대한 선언
h1 = '한글'
h2 = u'한글'

 

# 출력
print h1
print h2

>> 한글
>> 한글

 

# 서로다른 타입에 대한 확인
print type(h1)
print type(h2)

>> <type 'str'>
>> <type 'unicode'>

 

# 리스트에 추가후 출력
str_list = []
str_list.append(h1)
str_list.append(h2)
print str_list

>> ['\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00']

 

'''
# UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 오류 발생
if h1 == h2:
    print True
'''

 

'''
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)
if h1.encode('utf-8') == h2:
    print True
'''

 

str_list.append(h2.encode('utf-8'))
str_list.append(h1.decode('utf-8'))
print str_list

>> ['\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00', '\xed\x95\x9c\xea\xb8\x80', u'\ud55c\uae00']

 

if h1 == h2.encode('utf-8'):
    print True
else:
    print False


if h1.decode('utf-8') == h2:
    print True
else:
    print False


위와 같이 테스트를 해보면 파이선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: 

 


반응형