파이썬에서 한글을 다루다 보면, 인코딩에 대한 이슈를 그냥 지나칠 수 없다. 파이썬의 장점은 methods의 입력 데이터 형식을 지정하지 않아도 된다는 것이다.

C/C++에 익숙했던 분들은 아주 생소하게 느껴질 수 있는 부분이다.

가령 덧셈 함수를 만든다고 하면,

def sum(a,b):
    return a+b

로 간단하게 할 수 있다. 여기서 a, b는 정수, 실수 모두 가능하게 된다. 

하지만, a와 b가 리스트list 또는 사전dict 형태의 데이터라면 어떻게 처리해야 할까?

리스트 형식의 데이터라면, 각 i 번째 element끼리 더해서 결과를 반환하도록 하면되고,

사전 형식의 데이터라면, 같은 key 값을 갖는 데이터끼리 더해서 결과를 반환하도록 하면 될 것이다.


이제 원래 이슈로 돌아가서, 입력 데이터가 string, list, dict 중 어느 것이 든지 상관없이 데이터 값을 unicode로 변환하는 프로그램을 만들어 보자.

instance라는 함수를 통해서, 데이터가 string의 instance인지,

아니면, mutable sequence (i.e. list)의 instance인지,

아니면  mutable mapping (i.e. dict)의 instance인지.. 판단할 수 있다.

from collections import MutableMapping
from collections import MutableSequence

def convert_to_unicode(data, encoding='utf-8'):
    if isinstance(data, basestring):
        if not isinstance(data, unicode):
            return unicode(data, encoding)
        else:
            return data.encode(encoding)

    elif isinstance(data, MutableSequence):
        # list-like object                                                                   
        unidata = list()
        for item in data:
            unidataList = convert_to_unicode(item)
            unidata.append(unidataList)
        return unidata

    elif isinstance(data, MutableMapping):
        # dict-like object                                                                   
        unidata = dict()
        for key, value in data.items():
            unidata.update([(key, convert_to_unicode(value))])
        return unidata

    else:
        return data


신고