Perl을 윈도우 명령 프롬프트(cmd.exe)에서 사용할 시 UTF8으로 소스파일을 인코딩 하였다면 한글이 제대로 출력되지 않습니다.

여기에 대한 해결책으로 적은 글이 있습니다.
이글루스 백업 프로그램 윈도우에서 동작하게 하였습니다.
하지만 이 글을 토대로 해보니 제대로 동작하지 않아 새로운 방법을 찾아 해결하였습니다. 제가 찾은 방법을 여기에 적겠습니다.
1. use encoding 'utf8';을 쓰는 경우.
권고사안이 아니기에 쓰지 말아야겠지만, 저 같이 필요한 경우에는 다음과 같이 하면 해결할 수 있습니다.
use encoding 'utf8', STDOUT=> 'cp949';
즉, 뒤에 , STDOUT=>'cp949'라고 Standard Output의 인코딩을 따로 cp949로 맞추면 됩니다. 그럼 거기에 맞춰 글이 제대로 출력됩니다.

한글이 제대로 출력되고 있는 화면
2. use encoding 'utf8';을 쓰지 않는 경우.
2-1. 명령 프롬프트 코드를 UTF8으로 바꿈.
한글 윈도우의 경우 기본적으로 명령 프롬프트의 코드는 949입니다.

chcp 명령어로 알아본 현재 활성 코드 페이지 번호
이를 UTF8으로 바꾸면 됩니다. 바꾸기 전에 먼저 한글 폰트를 설정해야 합니다. 해당 프로그램에서 title-bar(위 그림에서 C:\WINDOWS\system32\cmd.exe가 적혀져 있는 곳)에 마우스 커서를 두고 오른쪽 버튼을 클릭하면 메뉴가 뜹니다. 거기서 속성을 클릭하면 속성 윈도우가 뜹니다.

cmd.exe 등록정보 window
여기서 글꼴 탭에 글꼴 부분에 '래스터 글꼴' 대신 '굴림체'를 선택합니다. 이렇게 해야지 UTF8 상에서도 한글이 제대로 출력됩니다. 확인을 누르면 '속성 적용' 확인 윈도우가 뜨는데 그냥 확인을 누릅니다.

그럼 위와 같이 window가 조금 바뀌게 될 것입니다. 이제 'chcp 65001' 명령어로 code page를 UTF8으로 바꿉니다.

그럼 Active code page(현재 코드페이지)가 65001로 맞춰졌다고 나옵니다. 이제 Perl 프로그램을 실행시켜보겠습니다.

그럼 위처럼 한글이 나오고 있는 것을 확인할 수 있습니다. 하지만 이상하게도 제대로 나오지 않고 반복된 화면이 계속 나옵니다. 이 점이 황당하여 저는 사용하지 않습니다. (그런데 왜 적었지?..;;;)
참조 : http://openclose.egloos.com/1225834
2-2. decode 후 encode – 가장 좋음.
기존에 제가 적었던 글에서 제공한 방법의 변형입니다. 기존에는 다음과 같이 하여 출력하였습니다.
1: print encode("euc-kr", decode("utf-8", "안녕하세요. NoSyu입니다.\n\n"));
하지만 위 방법으로는 제대로 동작하지 않는다는 것을 알았고, 고칠 것이 많아 은근히 귀찮았습니다. 따라서 use utf8;과 use Encode;로 새로운 module을 사용한 후 함수를 하나 만들었습니다.
1: use utf8;
2: use Encode;
3:
4: # utf8 decode
5: sub my_print($)
6: {
7: my ($src) = @_;
8: utf8::decode($src);
9: print encode("cp949", $src);
10: }
즉, my_print라는 sub-routine을 만든 후 그 안에서 utf8으로 decode를 하여 문자열을 만든 후 이를 cp949로 encode하여 나온 옥텟으로 출력을 하게 하는 것입니다. 이렇게 한 결과 제대로 한글이 나오는 것을 확인하였습니다. 그리고 정규표현식들도 utf8으로 제대로 작동하고 있었습니다.^^
저는 아직 Perl에 대해서 잘 모르기에 위의 방법 외에 다른 방법이 많을 것입니다.^^
참조
http://perlmania.kr/bbs/bbs.html?mode=read&table=windows&article=357&page=1
- PAR Packager로 이글루스 백업 프로그램 실행파일... (2)2009/01/16
- 야후(yahoo) 파이프(pipes) 이야기 (2)2009/01/15
- Windows(윈도우)에서 Perl module(CPAN) 설치법 (2)2009/01/12
- UTF8 Perl 소스, 명령 프롬프트(cmd.exe)에서 한... (2)2009/01/10
- C에서 가변 배열(Variable-Length Array) (8)2008/03/22
- 정규표현식 |은 순서대로 매치 (2)2007/11/28
- 정규표현식 룩어라운드(lookaround) (3)2007/11/26
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요
포르투갈어를 stdout 으로 뿌리는걸 잡아서 select box를 그리고 있었는데
특정 글자가 깨져서 하루종일 삽질을 했네요.
같은 방법으로
use encoding 'utf8', STDOUT=> 'utf8';
처리 했더니 감격스럽게도 되는군요.
덕분에 밤 10:46분에 해당 작업 완료 했습니다.
정말 감사합니다.
반갑습니다.
포르투칼어라... 전 전혀 모르는 미지의 세계군요.^^ㅜ
첫 번째 방법이 유효하셨군요!
이후 제가 살펴보니 소스 파일을 저장할 때 유니코드로 하면 저절로 된다느니 하는 얘기를 들었는데 명확한것인지 잘 모르겠습니다.OTL
고생하셔서 얻은 팁 하나 공개해주셔서 고맙습니다.ㅜ