2013年9月20日金曜日

UTF-8 な環境の Python3 で SHIFT-JIS とか非 UTF-8 な標準入力を処理

$ cat Test.py 
#!/usr/bin/env python3.2

import sys

for sLine in sys.stdin:
    print(sLine)
という python3 スクリプトがあって、標準入力から SHIFT-JIS のテキストを流し込むと
$ echo 'あいうえお' | nkf -s | ./Test.py 
Traceback (most recent call last):
  File "./Test.py", line 5, in 
    for sLine in sys.stdin:
  File "/usr/lib/python3.2/codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte
というように、入力を UTF-8 で処理しようとしてエラーになります。
$ cat Test.py 
#!/usr/bin/env python3.2

import sys
import io

for sLine in io.TextIOWrapper(sys.stdin.buffer, 'shift-jis'):
    print(sLine)
というように io.TextIOWrapper を使ったら
$ echo 'あいうえお' | nkf -s | ./Test.py 
あいうえお

うまく処理できました。

0 件のコメント:

コメントを投稿