Windows의 메모장으로 저장된 텍스트 파일은 일반적으로 ANSI 인코딩으로 저장됩니다. Windows 환경 자체가 ANSI 인코딩으로 이루어져 있어 생기는 결과입니다. 영어는 CP1251, 한국어는 CP949, ANSI 인코딩이라는 집합 속 각기 다른 이름으로 지정되어 있습니다.
우리가 EUC-KR이라고 알고 있는 한글 인코딩은 CP949의 하위 호환입니다.
하지만 이런 복잡한 환경은 편리하지 않습니다. 특정 상황에서 문장 속 다른 인코딩을 참조하는 문자가 혼용되어 있을 경우 문자열이 깨지게 됩니다.
예를 들어 'ABC가나다'라는 문장은 ANSI CP1251을 먼저 참조합니다. 하지만 뒤에 붙은 '가나다' 문장은 CP949를 참조해야 정상적인 출력이 가능합니다. 결국 한글은 깨진 문자로 출력됩니다.
이러한 상황을 방지하기 위하여 파일의 인코딩을 UTF-8로 변경합니다. 그렇다면 어떻게 변경해야 파일 속 내용은 그대로인 채로 인코딩만 변경할 수 있을까요?
Windows 환경에서 사용 가능한 iconv
http://gnuwin32.sourceforge.net/packages/libiconv.htm
libiconv-1.9.2-1-bin.zip 파일을 압축 해제하여 /bin 폴더 안에 있는 응용프로그램을 사용합니다. iconv 파일 옆에 있는 두 파일은 실행을 위하여 함께 있어야 합니다.
iconv -f CP949 -t UTF8 content.cp949.txt > content.utf8.txt
Windows iconv는 -output 옵션이 없기 때문에 파이프를 이용하여 처리된 콘텐츠를 저장할 수 있습니다.
Usage: iconv [OPTION...] [-f ENCODING] [-t ENCODING] [INPUTFILE...]
or: iconv -l
Converts text from one encoding to another encoding.
Options controlling the input and output format:
-f ENCODING, --from-code=ENCODING
the encoding of the input
-t ENCODING, --to-code=ENCODING
the encoding of the output
Options controlling conversion problems:
-c discard unconvertible characters
--unicode-subst=FORMATSTRING
substitution for unconvertible Unicode characters
--byte-subst=FORMATSTRING
substitution for unconvertible bytes
--widechar-subst=FORMATSTRING
substitution for unconvertible wide characters
Options controlling error output:
-s, --silent suppress error messages about conversion problems
Informative output:
-l, --list list the supported encodings
--help display this help and exit
--version output version information and exit
UTF-8로 저장된 파일은 CMD에서 chcp 65001 명령어를 사용한 이후 정상적으로 처리 가능합니다.
chcp 65001
type content.utf8.txt
CMD의 chcp 기본값은 chcp 949입니다.