OpenAI API에 자기소개서를 전송하는 중, SyntaxError: Non-UTF-8 code starting with '\xea' in file
가 발생했다.
UTF-8
인코딩 문제임을 알았고, 파일의 최상단에 # -*- coding: utf-8 -*-
을 입력해줌으로써 인코딩 방식을 명시해줬고, 정상적으로 작동하게 되었다.
# -*- coding: utf-8 -*-
는 ASCII를 디폴트 인코딩으로 하는 python2.x에서 주로 사용하는 해결법이다. 그러나 python3.x부터는 디폴트 인코딩으로 UTF-8을 사용하며, 나는 python3.9를 사용하고 있다.
그런데 어째서 에러가 났으며, 왜 # -*- coding: utf-8 -*-
으로 해결이 된걸까?
종종 텍스트 에디터나 IDE에서 디폴트 인코딩이 다른 것으로 설정되어 있어, 인코딩 오류가 난 경우가 있다고 한다. 그러나 내 경우에는 아니다. VSCode의 디폴트 인코딩이 UTF-8로 설정되어 있을 뿐더러, 에러 메시지를 보았을 때 UTF-8로도 실패했음을 알 수 있다.
에러가 발생한 위치에 집중해보았다. 에러가 한글을 다루는 코드의 시작점에서 발생한 것이 아니라, 자기소개서 문단과 문단 사이의 줄바꿈에서 발생했다.
안녕하세요, 개발자 이현진입니다.
(SyntaxError)
첫 째, 저는 디버깅을 잘 합니다.
그래서 "줄바꿈을 인코딩&디코딩하는 과정에서 문제가 발생한 것은 아닐까?"라고 의심하게 되었다.
그러나 놀랍게도 에러 메시지의 \xea
는 줄바꿈이 아니다! 줄바꿈은 인코딩시 \x0a
값을 가졌으며, \xea
는 홀로는 어떤 뜻도 지니지 않았고, ㄱ
으로 시작하는 문자들을 인코딩했을 때 주로 등장했다.
다방면으로 원인을 찾아보기도 했으나 알 수 있는 정보만으로는 부족했고, 해결한 이후에 해당 에러를 재현할 수 없었기 때문에, "UTF-8로 인코딩된 바이트코드의 형태로 봤을 때, \xea
이후의 값이 비정상적으로 잘렸거나 인식되지 않아 에러가 났나?"라는 추측의 형태로 종결할 수 밖에 없었다.
후에 한글 인코딩&디코딩에 관한 깊은 원리를 학습해야만 구체적인 원인을 파헤쳐볼 수 있을 듯 하다.
오늘도 기술부채가 늘었다.
https://www.utf8-chartable.de/unicode-utf8-table.pl?start=44032&utf8=0x