Thursday, May 14, 2009

"\u82a0"식의 출력을 perl로 "あ"로 변환하기

저는 메신저로, 제 메신저에 등록된 한국사람들에게 "[정보공유]" 메시지를 가끔 보냅니다.

[정보공유] 타이틀이 붙은 메시지의 내용은 대상자의 professional과 관련된 것입니다.
예를 들면, 기획과 관련된 것은 기획자나, 관련자, 또는 관심을 가지고 있는 사람에게, 개발에 관계된 것이면, 관련 개발자에게 보냅니다.
일과 관련된 것이면, 팀원에게도 [정보공유] 타이틀의 메신저를 보내죠.

전에는 java나 c#으로 작업할 때는 많이 보냈습니다만, 최근에는 리눅스 작업인데, 해당자는 그리 많지 않은 것 같아 제가 보내는 것도 뜸합니다.

단방향 정보송신이기 때문에 특별히 답변을 하지 않아도 괜찮다는 의미로, 이런 종류의 메시지의 끝에는 "이상." 이라고 붙입니다.(간혹 "이상."이라고 붙이는 것을 잊어먹기도 합니다만, 특별히 답변이 안오는 경우가 많고 저도 기대하진 않습니다.)
그러면서 가끔. 저도 이런식의 정보를 받기를 바란다는 메시지를 전달합니다.
예를 들어, java에 관련된 작업을 하는 사람이면, 일하면서 뭔가 새로운 라이브러리를 발견했다던가, 조금 시간이 걸리는 어려운 문제를 만나 이렇게 해결했다던가 하는 내용을 저도 받기를 원합니다.
그런데 아직까지 한번도 받아본 적이 없는 것 같습니다.

제가 모르고 있는 것을 정보공유해준다면 저는 공짜로 하나를 알게 되는 것이니 정말 고마운 일이고,
제가 알고 있는 것이라도 [정보공유]의 메시지를 보내 준다면, 동감하거나, 또는 더 나은 방법을 알고 있다면 제가 comment해 줄 수도 있을 것입니다.
그런데 한번도 받아보지 못하고 있는 건 좀 아쉽습니다.

아주 가끔은 제가 질문을 날립니다. 금방 해결이 안됐다거나, 더 좋은 방법을 알고 있는 사람이 있을까 해서입니다.
그런데 이 경우도 답변이 오지 않습니다.. 너무 난이도가 있는 걸 물어봐서 였을까요..
결국 오늘도 스스로 해결하고 자답을 [정보공유]로 날렸습니다.

오늘 질문했던 내용은 이것입니다.

python의 tool을 사용하는 perl이 있는데, tool의 output중에 파이선의 유니코드 표현방식인 \u82a0 과 같이 표현된 문자열이 있었습니다.
이를 적절히 해당 ShiftJis코드인 "あ"로 치환하고자 하는 것인데, perl에서의 unicode표현방식이 달라 바로 치환할 수는 없고 \x{82}\x{a0}와 같이 바꿔서 치환하는 것이었습니다.
이를 정규표현식으로 "\x82\xa0"치환하는 건 하겠는데, "\x{82}\x{a0}"는 어떻게 "あ"로 치환하지? 하는 문제였습니다.

그리고 자답으로 낸 해결책은 이것이었습니다. 답을 보면 간단합니다.

(1) python의 tool을 사용하는 명령을 내리기 전에 "export LANG=C;"명령을 앞에 써주어 영어로만 출력되게 한다.

우선은 (1)로써 작업을 진행하다가, 돌아오는 전철에서 생각난 것은

(2) eval을 이용한다

였습니다.

그리고 집에와서 테스트 코드를 작성해 보았습니다.

#!perl
$text = '\u82a0aaaあああbbb\u82a2';
$text =~ s/\\u(\w{2})(\w{2})/\\x\{$1\}\\x\{$2\}/g;
eval "\$text = \"$text\"";
print $text, "\n";

__END__
あ unicode 0x3042 shiftjis, cp932 0x82a0
ぃ unicode 0x3043 shiftjis, cp932 0x82a1
い unicode 0x3044 shiftjis, cp932 0x82a2
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT

결과는

c:\temp>perl test2.pl
あaaaあああbbbい

eval을 사용하는 것은 대부분의 스크립트 언어에 존재하기 때문에 비슷하게 써먹을 수 있을 것입니다. (groovy에도 eval이 있나??)
이 결과를 질문했던 사람들에게 [정보공유]로 전달해 주었습니다만, 어째 좀 아쉬운 느낌입니다.
메신저에 없는 사람이라도, 가볍게 물어볼 수 있는 곳이 있으면 좋겠습니다.
어째 KDLP등의 유명 개발자 커뮤니티에 올리면 너무 많은 사용자가 보고 많은 댓글이 달리기 때문에 부담스럽운건 저만 그럴까요. ^^;

No comments: