파이썬용 일한 번역 프로그램
글쓴이: lifthrasiir / 작성시간: 월, 2005/03/28 - 3:49오전
...물론 이 프로그램이 직접 번역하는 건 아니고, 천리안 트랜스위즈를 사용해서 번역을 해 줍니다. -_-; 원래는 HTML 파일을 번역하는 데 써 먹으려고 했던 거라서 거기에 대한 대비가 되어 있습니다. 코드는... 무지 지저분합니다 -_-
code snippet에도 올라 와 있습니다.
"""jktrans.py -- Meta Japanese-Korean translator using Chollian Transwiz Kang Seonghoon (Tokigun) @ TokigunStudio 2005 Distributable under the GNU LGPL. """ import urllib, urllib2, time, re, sys def translate(s, buf=32768): """Translate unicode string s, with buf-byte buffer. Returns UTF-8 string.""" avoidlist = ('image/', 'images/') regexp = re.compile('(?:x-)?(?:shift[-_]?jis|sjis)|euc[-_]?jp|iso-2022-jp|euc[-_]?kr|ks[-_]?c?[-_]?5601(?:.1989)?', re.I) def _translate(s): _s = s s = re.sub(regexp, 'utf-8', s.encode('utf-8')) t = str(time.time()) for x in avoidlist: s = s.replace(x, t+x.encode('base64')+t) req = urllib2.Request( 'http://transwiz.chol.com/files1003/exec/experience_text.asp', urllib.urlencode( {'guid': '{3155F703-DB3B-447a-B5ED-130DC640E263}', 'trans_mode1': 'j', 'trans_mode2': 'k', 'trans_message': s}), {'Referer': 'http://transwiz.chol.com/files1003/exec/main.asp'}) try: r = urllib2.urlopen(req).read() except urllib2.HTTPError: return _s.encode('utf-8') p1 = r.find('>', r.find('<TEXTAREA')) + 1 p2 = r.find('</TEXTAREA></TEXTAREA></td>', p1) s = r[p1:p2] for x in avoidlist: s = s.replace(t+x.encode('base64')+t, x) return s t = u''; r = '' for ss in s.splitlines(): t += ss + u'\n' if len(t) > buf: r += _translate(t) t = '' r += _translate(t) return r def detect_encoding(s): """Returns the encoding of given Japanese string.""" sa = s.decode('shift-jis', 'replace').count(u'\ufffd') sb = s.decode('iso-2022-jp', 'replace').count(u'\ufffd') sc = s.decode('utf-8', 'replace').count(u'\ufffd') if sb > sa < sc: return 'shift-jis' elif sc > sb < sa: return 'iso-2022-jp' else: return 'utf-8' if __name__ == '__main__': if len(sys.argv) < 3: print 'Usage: python %s <infile> <outfile>' % sys.argv[0] else: contents = file(sys.argv[1], 'rb').read() contents = contents.decode(detect_encoding(contents), 'ignore') file(sys.argv[2], 'wb').write(translate(contents))
- 토끼군
덤: 이 글을 올린 이후에도 이 프로그램이 정상 작동한다는 보장은 물론 없습니다.
Forums:
이 코드에서 찾을 수 있는 흥미로운 것은 사실 translate 함수가
이 코드에서 찾을 수 있는 흥미로운 것은 사실 translate 함수가 아니라 detect_encoding 함수입니다. 이 함수가 작동하는 방법은 요렇습니다.
- 가능한 인코딩으로 각각 변환해 본다.
- 그 결과를 비교해서 에러가 가장 적게 난 것을 찾는다. (에러가 안 나면 당연히 가장 적게 나오겠죠)
- 그 인코딩을 골라서 진짜로 해석해 본다.
1번 과정에서 사용되는 것은 str.decode 메소드입니다. 이 메소드는 첫째 인자로 인코딩 이름을 바꿔서 유니코드 문자열을 반환하는데, 둘째 인자에 문자열을 집어 넣을 수도 있습니다. (파이썬 레퍼런스에는 물론 써 있지요) 이 경우 둘째 인자는, decode 과정에서 오류가 날 때 해당 문자를 어떻게 처리할 지를 결정합니다. 여기서는 'replace'를 썼는데, 이 경우 오류가 난 문자는 U+FFFD로 치환됩니다. (이 문자는 유니코드에서 표시 불가능한 문자를 나타낼 때 씁니다) 이것의 갯수를 세면 오류가 난 갯수를 알 수 있겠죠.2번 과정이야 비교를 통해서 간단하게 알 수 있고, 3번 과정에서는 U+FFFD로 진짜 치환하면 번역할 때 난리가 날 테니까 -_- 무시하고 넘어 가도록 'ignore'를 넣어 줬습니다.
- 토끼군
[/]제가 영 허접하다 보니 if __name__ == '__main_
제가 영 허접하다 보니
if __name__ == '__main__':
이 구문에서 __name__ 과 같은 변수는
일부러 만들어서 사용하는 가요?
__main__
오래전에 잠깐 봤던거라 가물거립니다만..
__main__ 은 파이썬의 예약어라고 해야할까요?
jktrans.py 가 단독으로 실행된다면
if __name__ == '__main__': 이 참이 되어
그 내부가 C 의 main() 함수처럼 진입점이 됩니다.
만일 jktrans.py 이 다른 모듈에서 import 되어 사용된다면
위 조건절이 부정이 되어
내부가 실행이 안되구요.
음 더욱 자세한 내용은 밑에 답글 달아주실 분에게;;;
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
Re: __main__
흐흐흐... __name__은 import blahblah 처럼 import될 때는 그 모듈의 이름(이 경우 "blahblah")을, 그냥 실행할 때는 "__main__"을 가리킵니다. 그래서 그냥 실행할 때와 import될 때를 구별할 수 있는 거죠.
- 토끼군
댓글 달기