[BUG][python]UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 에러 해결

최혜원·2023년 2월 7일
0

BUG 해결

목록 보기
1/1

Error

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

문제 상황

  • import datasets 의 datasets 내부의 영어 text를 한국어 text로 번역하고자 했음
  • 사용한 라이브러리: pororo
  • 이를 위해 한 문장씩 번역을 돌리려고 했지만 pororo가 pytorch=1.6.0버전만 지원하고 현재 내가 사용하는 pytorch의 버전은 1.13.0이었음.
  • 그러나 토치 버전을 downgrade하기엔 다른 버전들과 dependency가 걱정되었음
  • 따라서 다른 가상환경에 pororo를 설치하고 .txt파일에 번역된 text를 저장해둔 다음 현재 사용하고 있는 가상환경에서 .txt파일을 불러오도록 설계했음.

😥문제 원인

  • 처음 code
ko_txt = []
mt = Pororo(task="translation", lang="multi")
for idx, en_txt in enumerate(dataset_text) :
    ko_text = mt(en_txt, src='en', tgt='ko').encode('utf-8')
    ko_txt.append(ko_text)
  • 위와 같이 mt에서 출력된 text에 .encode('utf-8')을 붙인 이유는 .encode('utf-8')을 붙이지 않고 ko_text를 print했을 때 잘 출력하다가 중간에 UnicodeEncoderError가 발생했기 때문이다.
    -> 이부분에 대한 에러는 아마도 출력 중간에 유니코드가 섞여있었지 않았을까 생각한다.
  • 출력된 한글 text는 str 형식
  • 그래서 encode를 적용했을 때 에러는 발생하지 않으나 출력을 하게 되면 b'K200\xc0\xce\xb5\xa6\xbd\xba' 이런 형태로 출력된다
  • 에러는 발생하지 않지만 출력 결과가 utf-8(8bit 유니코드)로 encoding 된 채로 출력했을 것이다.
  • 결과적으로, 유니코드를 출력하려고 하는데 터미널이 지원을 하지 않는 것.

😊문제 해결

  1. 처음 시도는 아래처럼 다시 decode하는 방식으로 했었는데 해결되지 않았다.
ko_text = mt(en_txt, src='en', tgt='ko').encode('utf-8').decode('utf-8')
  1. 이것도 잘 적용되지 않았다.
ko_text = mt(en_txt, src='en', tgt='ko').encode('utf-8', 'ignore').decode('utf-8')
  1. 아래의 package를 깔아주고 그 아래의 코드를 적용했는데 성공했다..
    참고한 글
  • 찾아보니 아래 package는 다른 언어로 번역하고자 할 때 사용하는 pack 이라고 한다.
  • 즉 다른 언어, 유니코드 상에서 영어가 아닌 다른 언어로 등록된 유니코드를 출력하고자 할 때 에러가 발생하는 것을 이 패키지를 설치하면 정상적인 문자로 출력할 수 있게 해주는 것.
  • 리눅스에서 사용 가능
sudo apt-get install language-pack-en
ko_text = mt(en_txt, src='en', tgt='ko')
ko_txt.append(ko_text)
profile
ML_engineer

0개의 댓글