한글이나 특수 문자가 들어간 데이터를 저장하는 경우 뭔가 전송시 오류로 인해 잘못될까봐 변화를 주고 싶은 생각이 듭니다.
여러 형태의 엔코딩들이 존재하는 상황에서 보통 txt형태로 저장하는 곳에서 유용하게 사용할 수 있는데 그래서 인터넷에서는 주소를 전달할때 url encoding을 사용하게 된다.
여기에서는 대표적으로 두가지를 인코딩을 소개합니다.
url encoding
url encoding의 간단한 예제는 GET 시 사용하는 주소에 한글이 존재하는 경우 사용하게 됩니다. 간단 사용법은 urllib 모듈을 이용하는 방법입니다.
>>> import urllib.parse >>> q = '한글abc' >>> t=urllib.parse.quote(q) >>> t '%ED%95%9C%EA%B8%80abc'
반대로 되돌리기 위해선 unquote() 함수를 사용하면 됩니다.
>>> t '%ED%95%9C%EA%B8%80abc' >>> uq = urllib.parse.unquote(t) >>> uq '한글abc'
base64
이메일 전송시나 웹 컨텐츠 포맷등에서 많이 사용합니다.
일단 들어가기에 앞서 python에서 string은 기본적으로 encoding이 되어서 표현되는 변수 형태입니다. 따라서 base64로 인코딩을 위해서는 str을 byte형태로 만들어 줘서 진행해야합니다. 여기에서는 utf-8포맷으로 bytes로 변환했습니다.
예제
import base64 mytext = "한글입니다.abc" # bytes로 변환해줍니다. bytedata = mytext.encode('utf-8') print("bytedate:",bytedata) # base64 인코딩을 합니다. encoded= (base64.b64encode(bytedata)) print("base64encoded:",encoded) # byte를 text형태로 출력하기 위해서 디코딩을 함 encoded_ascii=encoded.decode('ascii') print("base64txt:",encoded_ascii)
결과
bytedate: b'\xed\x95\x9c\xea\xb8\x80\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4.abc' base64encoded: b'7ZWc6riA7J6F64uI64ukLmFiYw==' base64txt: 7ZWc6riA7J6F64uI64ukLmFiYw==
디코딩 예제
import base64 # decode text = '7ZWc6riA7J6F64uI64ukLmFiYw==' strtext = base64.b64decode(text).decode('utf-8') print(strtext,type(strtext)) strtext = base64.b64decode(text).decode('ascii') print(strtext,type(strtext))
결과
한글입니다.abc <class 'str'> Traceback (most recent call last): File "_27_base64.py", line 20, in <module> strtext = base64.b64decode(text).decode('ascii') UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)
포맷이 안맞으면 오류가 발생합니다.