필요한 문서를 구했는데 파일을 열어보니 온통 깨진 문자만 어지럽게 늘어져 있다. 아~ 난감하다.

아마도 파일 인코딩이 나와는 다른 환경에서 작성된 문서인 듯 싶다. 웹이 보급되고 다양한 운영체제, 다양한 언어 환경에서 작성된 문서를 접할 일이 많아지다보니 요즘에는 흔히 겪는 일이 되어 버렸다.

이번 포스트는 문서의 파일 인코딩을 내가 원하는 형식으로 변환하는 방법에 관한 내용이다.

file (determine file type)

우선 대상 문서(unknown.txt)의 인코딩 정보를 확인해보자.

$ file -I unknown.txt
unknown.txt: text/html; charset=unknown-8bit

unknown-8bit 가 뭐지?

$ iconv --list | grep unknown-8bit

iconv 에서 지원하는 엔코딩 목록에도 없다. unknown 이라는 이름처럼 알 수 없나 보다.

하지만, 한글 문서라는 확신이 있다면 아마도 UTF-8, EUC-KR, CP949 중 하나일 것이다. (더 있을 수도 있겠지만, 여기까지가 나의 한계다.)

내 장비의 모든 환경이 UTF-8 에 맞춰져 있고 최종으로 변환하고 싶은 형식이 UTF-8 이므로 후보에서 제외하고 나머지 둘 중에서 확인해보자.

iconv (character set conversion)

  • 사용법
$ iconv -f encoding -t encoding inputfile
$ iconv --from-code=encoding --to-code=encoding inputfile
  • EUC-KR -> UTF-8 (에러난 걸 보니 EUC-KR 은 아닌가보다.)
$ iconv --from-code=EUC-KR --to-code=UTF-8 unknown.txt
iconv: unknown.txt:112:72: cannot convert
  • CP949 -> UTF-8
$ iconv --from-code=CP949 --to-code=UTF-8 unknown.txt

성공이다. 정상적으로 UTF-8 로 변환된 한글 문서가 보인다.

iconv (모두 시도해 보기)

그런데 만약에…

원래 파일이 어떤 인코딩으로 되어 있는지 도저히 짐작할 수 없는 상황이라면 어떻게 해야할까?

어떤 인코딩 타입인지 몰라도 알아서 변환해 주는 방법이 있다면 좋겠지만 필자도 엔코딩에 대해 잘 몰라서 그런 방법은 모르겠다. 그래서 간단한 스크립트를 작성해 보았다.

일단 모든 엔코딩 타입으로 시도해 보고 iconv 가 error 없이 정상적으로 엔코딩 변환을 성공한 경우에만 파일로 남겨놓았다.

iconv 가 변환을 성공해도 확인해보면 역시 한글이 깨어져 있는 경우가 있으므로 각 output 파일들을 수동으로 열어서 확인해 보고 성공적으로 정상 변환된 것을 직접 고르면 되겠다.

#!/usr/bin/env bash
INPUT=unknown.txt

for ENCODING_TYPE in $(iconv --list | cut -d ' ' -f 1); do    
    OUTPUT=output.$ENCODING_TYPE.txt
    iconv -f $ENCODING_TYPE -t UTF8 $INPUT > $OUTPUT
    if [ $? -eq 0 ]; then
        echo "[SUCCESS] converted successfully ($ENCODING_TYPE -> UTF8)"
    else
        echo "[FAIL] cannot convert ($ENCODING_TYPE -> UTF8)"
        rm -f $OUTPUT
    fi  
done