UnicodeEncodeError: 'cp932' codec can't encode character ... illegal multibyte sequence


テンプレ

import io, sys
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

襲来。UnicodeEncodeError

Windows, MSYS2, Python3の環境でプロセス間通信が必要になった。
Python3のスクリプトを子プロセスで走らせて出力を親にパイプしてごにょごにょする。
そしたらスクリプト側でおなじみのUnicodeEncodeErrorが出た。

UnicodeEncodeError: 'cp932' codec can't encode character '\xa9' in position 9261: illegal multibyte sequence

エラーを出したコードはこんな感じ。

#!/usr/bin/python3
# coding: utf-8
import sys, urllib3

http = urllib3.PoolManager()
req = http.request('GET', 'http://qiita.com')

if req.status == 200:
    print(req.data.decode())

else:
    print('Error: {0}'.format(req.status))

どこから例外が飛んでくるかというとdecode()かと思ったらprint()から飛んできてる。

こちらを参考にコードを修正すると無事に出力できた。
参照: UnicodeEncodeError: に悩まされない。Python2.x から Python3.x への乗り換え

#!/usr/bin/python3
# coding: utf-8
import io, sys, urllib3 # Here

http = urllib3.PoolManager()
req = http.request('GET', 'http://qiita.com')

if req.status == 200:
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # Here
    print(req.data.decode())

else:
    print('Error: {0}'.format(req.status))

UnicodeDecodeErrorは?

UnicodeDecodeErrorについては↓の記事を参照してください。