PyRTF에 다국적 지원을 추가하는 방법
mIRC 로그를 RTF 파일로 정리하는 프로그램을 짜면서 초장에 제일 막혔던 건 RTF의 한국어 인코딩 부분이었다. PyRTF라고 파이썬으로 꽤 고레벨에서 RTF 파일을 만드는 모듈을 발견하기는 했는데, 이게 다국어 지원이 전혀 없다는 걸 깨닫고 욕이 나왔다. (..) 버전 0.45 정도에 과한 기대를 해도 안 되겠지만 말야.
위키피디아에서 RTF 표준에 대한 기사를 보고서도 한참 헤맨 게, utf-8 디코딩을 해서 유니코드를 내려고 해도 결과는 이런 식이었거든.
문제는 저건 RTF 파일에서 받지를 않는다는 점. 워드프로세서로 열어보면 안 나온다. 그래서 역으로 워드프로세서로 '안녕'을 치고 에딧패드 (EditPad)로 열어보니 다음과 같이 나왔다.
이 차이를 가지고 한동안 끙끙대다가 ord 기능을 알게 되어서 결국 다음과 같은 식으로 해결했다.
이 기능을 달아두고 RTF 파일을 만들 때는 예를 들어 추가할 내용을 string이라고 하면
하는 식이 된다. 사실 글자 뒤마다 붙은 \'3f가 무슨 뜻인지도 모르고 \u50504와 \uc538의 차이가 뭔지도 모르겠다. 그걸 알 만큼 공부했으면 프로그래머지, 허접 취미 코더겠나. 내가 아는 건 해보니 일단 됐다는 것. 그리고 내가 테스트해본 한 이렇게 하면 우리말로도 PyRTF를 이용해 RTF를 쓸 수 있겠다는 정도이다. 막혔던 문제에 대해 해결책을 찾아낸다는 건 즐거운 일~
위키피디아에서 RTF 표준에 대한 기사를 보고서도 한참 헤맨 게, utf-8 디코딩을 해서 유니코드를 내려고 해도 결과는 이런 식이었거든.
>> print '안녕'.decode('utf-8').encode('unicode_escape')
>> \uc548\ub155
문제는 저건 RTF 파일에서 받지를 않는다는 점. 워드프로세서로 열어보면 안 나온다. 그래서 역으로 워드프로세서로 '안녕'을 치고 에딧패드 (EditPad)로 열어보니 다음과 같이 나왔다.
\u50504\'3f\u45397\'3f\u33\'3f
이 차이를 가지고 한동안 끙끙대다가 ord 기능을 알게 되어서 결국 다음과 같은 식으로 해결했다.
def ordinalCode(string, enc):
ordcode =''
string = string.decode(enc)
ordinals = [ord(x) for x in string]
for ordinal in ordinals:
#디버깅 코드
#print ordinal
ordcode = "%s\\u%d\\'3f" % (ordcode,ordinal)
return ordcode
이 기능을 달아두고 RTF 파일을 만들 때는 예를 들어 추가할 내용을 string이라고 하면
enc = 'utf-8'
newline = ordinalCode(string, enc)
p.append(newline)
section.append(p)
하는 식이 된다. 사실 글자 뒤마다 붙은 \'3f가 무슨 뜻인지도 모르고 \u50504와 \uc538의 차이가 뭔지도 모르겠다. 그걸 알 만큼 공부했으면 프로그래머지, 허접 취미 코더겠나. 내가 아는 건 해보니 일단 됐다는 것. 그리고 내가 테스트해본 한 이렇게 하면 우리말로도 PyRTF를 이용해 RTF를 쓸 수 있겠다는 정도이다. 막혔던 문제에 대해 해결책을 찾아낸다는 건 즐거운 일~
tags : 스크립팅
분류없음
2008/04/02 21:06

댓글을 달아 주세요
프로그램 만지며 에러를 고치는 것도 큰 재미죠^^
로키님은 정말 못하시는게 없는 거 같아서 부럽니다^_____^
문제를 해결한 순간의 그 쾌감이 비할 데가 없죠.^^ 못하는 게 없긴요, 잘하는 거 빼고 다 못해요(??)