본문 바로가기
IT/Python

Python Error - UnicodeDecodeError : 'utf8' codec can't decode byte 0xeb in position 0

by 큰공 2021. 10. 7.
728x90
반응형

 

 

들어가며

 파이썬 개발 중 아래와 같이 "UnicodeDecodeError" 가 발생하였다. 

 이를 해결했던 방법을 공유하고자 합니다.

 

에러 코드

root@bigball:~/python# python Instagram.py 
Traceback (most recent call last):
  File "Instagram.py", line 111, in <module>
    search.send_keys('#'+tag[0])
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
    'value': keys_to_typing(value)})
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 319, in execute
    response = self.command_executor.execute(driver_command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 372, in execute
    data = utils.dump_json(params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/utils.py", line 33, in dump_json
    return json.dumps(json_struct)
  File "/usr/lib/python2.7/json/__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 0: unexpected end of data

UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 0: unexpected end of data

 

인코딩/디코딩이란?

 코딩은 "알파벳"으로 한다. 하지만, 컴퓨터는 이 "알파벳" 라는 언어를 어떻게 해석할 수 있을까? 를 고민해야 한다. 실제로 컴퓨가 알아 들을 수 있는 언어는 0,1 2진수가 전부이다. 이는 웬만한 IT 종사자들 뿐만아니라 일반인들도 충분히 알고있다.

 

 예~~전에는 컴퓨터가 알아듣기에 편하도록 0,1 으로만 작성된 언어를 가지고 프로그래밍을 했다고 하지만, 이제는 알파벳으로 작성한다.

 

 이 알파벳으로 작성된 코드를 컴퓨터가 알아들을 수 있는 이진수로 변환해주는것을 "인코딩" 이라고 한다.

 또한 반대로 이 코드를 사람이 알아들을 수 있는 알파벳을 변환해주는것을 "디코딩" 이라고 한다.

 

 

발생 원인

 일단 Instagram.py line 111 에서 "search.send_keys('#'+tag[0])" 에서 오류가 발생함을 알 수 있다.

 예상컨데 "'#'" 문자열 처리에 있어서, 디코딩 오류가 생긴것이다.

  File "Instagram.py", line 111, in <module>
    search.send_keys('#'+tag[0])

 TRY 1 - 파이썬 인코딩 주석 달기

# -*- coding: utf-8 -*-

 파이썬2.x의 기본 인코딩은 ascii 이다. 파이썬 스크립트에서 한글을 사용하게 될 때 파이썬은 ascii 인코딩일 것으로 예상하고 해석하려고 하지만 한글을 ascii로 해석이 불가능 하기 때문에 Error가 발생 한다.

 

 따라서, 코드가 해당 파일이 어떤 인코딩으로 작성되어 있는지 명시해 준다.

 

 이 것이 위의 주석 형식으로 달린 것이다.

 

 하지만, 이것도 문제 해결이 되지 않았다.

 

 TRY 2 - 파일 자체의 VIM 인코딩 설정하기

 현재 개발 환경이 GUI 적인 IDE를 사용하는 환경이 아니라, 콘솔에서 명령어로 수행하는 환경이였다. 동일한 코드가 IDE 상에서는 정상 동작하는데, 콘솔환경에서는 동작하지 않는것이 문제였다.

 

 그래서 콘솔 창에서 VIM 을 사용하여, 파일을 수정 / 저장하는데, 이 방식이 문제가 있을거 같아 VIM 저장시에 인코딩 설정을 해주었다.

 

 현재 보이는 문자의 인코딩을 수정하는 방법

:e ++enc=utf-8
:e ++enc=euc-kr

 

현재 파일의 인코딩을 수정하는 방법

:set fileencoding=utf-8
:set fileencoding=euc-kr

 

 위와 같이 ":set fileencoding=utf-8" 을 하여도 역시나 문제는 해결 되지는 않았다.

 

 해결방법

 알고나니 역시 해결방법은 너무나도 간단했다.

 다시 한번 위의 코드를 살펴보자.

root@bigball:~/python# python Instagram.py 
Traceback (most recent call last):
  File "Instagram.py", line 111, in <module>
    search.send_keys('#'+tag[0]) // 에러 발생 부분
.
.
.
.
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 0: unexpected end of data

  바로 코드가 python 2.7 에서 동작함으로 알 수 있다. 실제 해당 환겨에서 python 3.6 버젼이 설치 되어 있음에도 말이다.

 

 python3 으로 해당 코드를 실행하면 해결 된다.

 

root@bigball:~/python# python3 Instagram.py 

 

 

맺으며

 결국 파이썬 버젼 차이였다.

  

UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 0: unexpected end of data

 

에러가 발생한다면 phthon3 버젼으로 재실행 해보자.

 

 

728x90
반응형

댓글