본문 바로가기
Python

[Python] 문자열 인코딩과 디코딩하는 방법

by A6K 2022. 7. 2.

파이썬에서 문자열 데이터를 다룰 때 인코딩을 신경써야 할 경우가 있다. 영어로 구성된 텍스트 데이터야 ASCII로만 처리가 되니까 인코딩 문제가 없는데, 한글 같은 문자가 포함되어 있는 텍스트를 처리할 때에는 인코딩 문제를 신경써야 한다.

인코딩 감지

문제는 내가 만든 문자열 데이터를 내가 읽어서 처리하는 경우라면 뭘로 인코딩되어 있는지 알고 있기 때문에 데이터를 처리하는데 문제가 없다. 하지만 다른 사람이 전송한 문자열 데이터가 어떤 포맷으로 인코딩되어 있는지를 모르면 제대로 해석할 수 없다.

문자열 데이터가 어떤 형식으로 인코딩되어 있는지를 확인하기 위해서 chardet 라이브러리가 필요하다. pip로 설치해주자.

$ pip install chardet

chardet 모듈의 detect() 함수를 이용하면 입력받은 바이너리가 어떤 문자열을 인코딩한 것인지를 추정해준다.

import chardet
import urllib.request

with urllib.request.urlopen('https://hbase.tistory.com') as f:
    response = f.read()

print(chardet.detect(response))

결과

{'encoding': 'utf-8', 'confidence' : 0.99, 'language': ''}

문자열 인코딩 및 디코딩

파이썬의 string에는 encode() 함수가 내장되어 있다. 이는 문자열을 특정 인코딩 타입으로 인코딩해서 바이너리로 만들어주는 함수다.

>>> string = "테스트 문자열"
>>> string.encode(encoding='UTF-8', errors='strict')
b'\xed\x85\x8c\xec\x8a\xa4\xed\x8a\xb8 \xeb\xac\xb8\xec\x9e\x90\xec\x97\xb4'
>>> string.encode(encoding='EUC-KR', errors='strict')
b'\xc5\xd7\xbd\xba\xc6\xae \xb9\xae\xc0\xda\xbf\xad'

"테스트 문자열"이라는 문자열을 각각 UTF-8과 EUC-KR로 인코딩 했을 때의 결과를 확인할 수 있다.

마찬가지로 string에 내장되어 있는 decode() 함수로 바이너리로 표현된 문자열을 텍스트 형태로 해석할 수 있다.

>>> string = "테스트 문자열"
>>> encoded = string.encode(encoding='UTF-8', errors='strict')
>>> print(encoded)
b'\xed\x85\x8c\xec\x8a\xa4\xed\x8a\xb8 \xeb\xac\xb8\xec\x9e\x90\xec\x97\xb4'
>>> encoded.decode(encoding='UTF-8', errors='strict')
'테스트 문자열'

encode(), decode() 함수의 errors 인자로 줄 수 있는 값은 다음과 같다.

  • 'backslashreplace' : 에러 발생시 해당 부분 삭제
  • 'ignore' : 에러 발생시 무시
  • 'namerelace': 에러 발생시 Text 설명으로 변경
  • 'strict' : 에러 발생시 변환 에러를 띄움
  • 'replace' : 에러 발생시 해석할 수 없는 문자를 '?' 문자로 표시
  • 'xmlcharrefreplace' : 에러 발생시 XML 문자로 변경

예를 들어 UTF-8으로 인코딩한 것을 EUC-KR로 디코딩하려고 했을 때

>>> string = "abc 한글 def"
>>> encoded = string.encode(encoding="UTF-8", errors='strict')
>>> encoded.decode(encoding='EUC-KR', errors='strict')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'euc_kr' codec can't decode byte 0xed in position 4: illegal multibyte sequence
>>> encoded.decode(encoding='EUC-KR', errors='replace')
'abc ���湲� def'
>>> encoded.decode(encoding='EUC-KR', errors='ignore')
'abc 湲 def'

이런식으로 출력된다.


 

파이썬 스크립트 작성에 도움되는 글 모음

파이썬으로 프로그램을 작성할 때 도움되는 글들을 모아본다. Python 문법 Python 모듈

hbase.tistory.com

 

댓글