#!/usr/bin/env python import sys import six import subprocess PIPE = subprocess.PIPE enc = lambda s: s.encode('utf-8') if six.PY2 else s.encode() dec = lambda b: unicode(b, 'utf-8') if six.PY2 else b.decode() def do_cmd(cmd, in_b): cmd = enc(cmd) proc = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE) return proc.communicate(in_b)[0] def get_stdin(): fi = sys.stdin if six.PY2 else sys.stdin.buffer return fi.read() # b def put_stdout(b): fo = sys.stdout if six.PY2 else sys.stdout.buffer fo.write(b) def guess(b): b = do_cmd('nkf -g', b) return dec(b).strip() def cvt(b, opt): if opt == 'ASCII': return b d = { 'ISO-2022-JP': '-j', 'EUC-JP': '-e', 'Shift_JIS': '-s', 'UTF-8': '-u', } if opt not in d.values(): opt = d.get(opt, '-u') return do_cmd('nkf ' + opt, b) if __name__ == "__main__": b = get_stdin() opt = guess(b) u8 = cvt(b, '-u') s = dec(u8) # ... u8 = enc(s) b = cvt(u8, opt) put_stdout(b) # EOF