본문 바로가기
프로그래밍

[python3] 문자열 특수문자 처리, base64 인코딩, ASCII, utf-8 에러 관련

by 0pen3r 2022. 5. 23.
반응형

[상황]

파이썬에서 다수의 [특문+문자]를 str로 처리하고(1)

base64로 인코딩(2) 해야되는 케이스가 있었다.

 

근데.. 파이썬을 썼다가 안썼다가 하니.. 에러가 주구장창 나서 스트레스르 받았다.

이에 해당 이슈 정리


[발생한 에러 종류]

ValueError: string argument should contain only ASCII characters

TypeError: a bytes-like object is required, not 'str'

UnicodeEncodeError: 'ascii' codec can't encode characters in position 359-361: ordinal not in range(128)


[요약]

<방법1>

utf-8로 변환하고 bs64인코딩, utf-8 디코딩

bs64디코딩 후 utf-8 디코딩

 

text = '임의값 입력'
bs64_text=(base64.b64encode(text.encode('utf-8')))
enc_text=bs64_text.decode('utf-8')
print(enc_text)

print('개행 테스트\n\n\n')

data1 = base64.b64decode(enc_text)
data2 = data1.decode('utf-8')
print(data2)

 

<방법2>

str => encode() = bytes
bytes => decode() = str

mytext_bytes = mytext.encode()  #bytes
mytext_str = mytext_bytes.decode() #str 

encoded=(base64.b64encode(mytext.encode())) #bytes 된거 base64로

tmp = base64.b64decode(encoded) # base64 디코딩

print(tmp.decode()) #base64 디코딩된거 str로

[상세1]

encoded=base64.b64encode(mytext) 실행 시 에러1 발생
 
[에러1]
 TypeError: a bytes-like object is required, not 'str'

<원인> : base64 인코딩할 때 bytes type이 필요해서 에러 터짐

<해결>
str => encode() = bytes 되고
bytes => decode() = str 됨
또는 utf-8로 형변환 함

<예제>
mytext_bytes = mytext.encode()  #bytes
mytext_str = mytext_bytes.decode() #str

########################################################################################################
########################################################################################################


encoded=(base64.b64encode(mytext.encode('ascii'))) 실행 시 에러2 발생
에러3은 원인 까먹음

[에러2,3]
 UnicodeEncodeError: 'ascii' codec can't encode characters in position 359-361: ordinal not in range(128)
 ValueError: string argument should contain only ASCII characters

<원인/해결>
파이썬 디폴트는 unicode 사용 
한글 사용하려면 unicode를 utf-8로 변환해서 사용 가능  
unicode를 utf-8로 encoding ㄱㄱ

<예제>
encoded=(base64.b64encode(mytext.encode('utf-8'))) # utf-8 변환 또는
encoded=(base64.b64encode(mytext.encode())) # bytes 변환

 

-끝-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p.s.

아래 사이트를 참고하여 해결하려 했으나. ascii 인코드 수행 시 에러나서 utf-8로 시도하니 됬다.

https://techexpert.tips/ko/python-ko/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B2%A0%EC%9D%B4%EC%8A%A464-%EC%9D%B8%EC%BD%94%EB%94%A9/

 

728x90
반응형