bash script2023. 8. 22. 19:20

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/602649

인코딩이 불분명한 텍스트 파일이 있을 경우 iconv를 이용하는 간단한 셸 스크립트를 작성해서 인코딩을 확인해 볼 수 있다. 캐럭터 인코딩을 변환해주는 도구인 iconv에 대한 기본적인 내용은 이전 게시물을 참고하자. 여기로

 

방법은 단순하다. iconv에서 지원하는 인코딩 목록 전체를 가지고 현재 내 리눅스 시스템에서 사용중인 인코딩(통상 UTF-8)으로 한번씩 다 변환해 보는 것이다. 이걸 수작업으로 하기가 귀찮으므로 스크립트를 만들어서 하면 된다.

먼저, iconv에서 지원하는 인코딩 목록을 출력해 보자.

# 지원하는 캐럭터 인코딩 목록 확인
iconv -l | more
437//
500//
500V1//
...

iconv 버전에 따라 출력이 다를 수도 있겠는데, 어쨌든 데비안/우분투에서는 위와 같은 형태를 볼 수 있을 것이다. cut 명령을 이용해서 뒤쪽에 있는 "//" 이 부분을 제외하고 인코딩 명칭만 임시 파일에 저장한다.

 

# 인코딩 목록을 enc_list.txt 파일에 저장
iconv -l | cut -d'/' -f1 > enc_list.txt

자, 이제 스크립트 파일을 만들어 보자. 대상 텍스트 파일을 인자(argument)로 입력 받아서 확인 결과는 "파일명.result" 이런 식으로 저장하는 스크립트다.

# 확인 대상 파일(실행명령에서 인자로 받음)
src_file="$1"
# 인코딩 목록 파일
enc_list_file="enc_list.txt"
# 각 인코딩별로 확인 시작
while read -r encoding_name
do
  echo -n "$encoding_name: " >> "$1.result"
  iconv -f $encoding_name -t UTF-8 "$src_file" >> "$1.result"
done < "$enc_list_file"

위와 같은 내용으로 encoding_id.sh라는 이름의 스크립트를 만든다. 간단히 설명하자면, while 반복문에 read 명령을 조합하여 인코딩 목록을 하나식 읽어서 iconv의 -f 옵션에 적용시킨 형태다. 인코딩 명칭과 변환된 내용이 같은 줄에 있도록 하기 위해 인코딩 명칭을 출력하는 echo 명령에는 줄바꿈이 포함되지 않도록 -n 옵션을 사용했다.

 

이제 확인하고 싶은 파일을 스크립트의 인자로 주고 실행.

# my_file.txt의 인코딩 확인
bash encoding_id.sh my_file.txt

결과 파일에서 내용이 제대로 출력된 인코딩이 어느 것인지 차분하게 확인해 보면 된다.

# 결과 확인
cat my_file.txt.result | more

지원하는 인코딩 종류가 많기 때문에 결과 파일도 꽤 길어서 번거롭긴 하지만, 그래도 없는 것보단 낫다.

728x90
Posted by 반달가면