레이블이 base64 encoding인 게시물을 표시합니다. 모든 게시물 표시
레이블이 base64 encoding인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 24일 일요일

python url encoder / base64 / 인코딩

한글이나 특수 문자가 들어간 데이터를 저장하는 경우 뭔가 전송시 오류로 인해 잘못될까봐 변화를 주고 싶은 생각이 듭니다.

여러 형태의 엔코딩들이 존재하는 상황에서 보통 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)


포맷이 안맞으면 오류가 발생합니다.