html 저장 오류 ‘cp949’ codec can’t encode character ‘\xa9’

티스토리 블로그 작성을 위해 html을 자동으로 생성하는 파이썬 코드를 작성하고 with open()으로 html 파일로 저장했으나 다음과 같은 오류가 났네요.

오류가 난 파이썬 코드

with open('./blog_html/sample.html', 'w') as f:
  f.write(html)

오류 코드는

"Traceback (most recent call last):
  File "d:\python_dev\blog_create.py", line 518, in 
    main(ext_no, name, post_title, comment)
  File "d:\python_dev\blog_create.py", line 504, in main 
    f.write(html) 
UnicodeEncodeError: 'cp949' codec can't encode character '\xa9' in position 11589: illegal multibyte sequence"

오류 원인 파악 및 해결 방법

이 오류는 html 파일 생성 시 문자열(html)을 write(기록)하려고 할 때 ‘cp949’ 코덱으로는 인코딩할 수 없는 문자(‘\xa9’)가 포함되어 있기 때문에 발생한다고 합니다.

이러한 문자를 html 파일에 쓰려면 인코딩 문제를 회피하도록 해야 하는데, 문자열을 파일에 쓸 때 인코딩 오류를 피하기 위해

encoding = ‘utf-8’ 을 추가해서 되는 경우도 있지만, 이모지 등의 특수 문자가 있는 문자열인 경우 이 또한 에러가 나는 경우가 많습니다.

특수 문자까지 해결하기 위해서는 파일을 바이너리 모드로 열고 원하는 인코딩을 직접 지정하는 방법이 있습니다.

with open('./blog_html/sample.html', 'wb') as f:   
  f.write(html.encode('utf-8'))

위와 같이 수정하고 실행해보니 저장이 잘 되었네요!

결론적으로,

HTML 파일 저장 시 발생하는 ‘cp949’ codec can’t encode character ‘\xa9’ 오류는 파일의 인코딩 방식과 운영 체제의 기본 인코딩 방식이 일치하지 않아 발생하는 문제인데,

이를 해결하기 위해 위와 같이 명시적으로 인코딩 방식을 지정하거나, 다른 방법으로는 chardet 라이브러리를 사용하여 자동으로 감지하는 방법, 또는 sys.stdout과 sys.stderr의 인코딩을 변경하는 방법 등을 사용할 수 있답니다.