Pythonをやっててこの間もはまりました。
Python2.x系のときは、strオブジェクトとunicodeオブジェクトが別々でcodecs使っていろいろしていた。
Python3.x系はunicodeに統一されて扱いやすくなったと思っていた。
1 2 3 |
# -*- coding: utf_8 -*- print('こんにちはこんにちは') |
実行結果
1 2 3 4 5 6 |
$ python3 hello.py Traceback (most recent call last): File "hello.py", line 7, in <module> print('\u3053\u3093\u306b\u3061\u306f\u3053\u3093\u306b\u3061\u306f') UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128) $ |
下記の参考URLを確認して環境のLANGを調べたが設定されていなかった。
LANG=ja_JP.UTF-8
を設定し、再度実行するがエラーに変わりなし。
先ほどのhello.pyを書き換えて
1 2 3 4 5 6 |
# -*- coding: utf_8 -*- import sys print(sys.getdefaultencoding()) print(sys.stdout.encoding) print('こんにちはこんにちは') |
実行結果
1 2 3 4 5 6 7 8 |
$ python3 hello.py utf-8 ANSI_X3.4-1968 Traceback (most recent call last): File "hello.py", line 7, in <module> print('\u3053\u3093\u306b\u3061\u306f\u3053\u3093\u306b\u3061\u306f') UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128) $ |
デフォルトエンコードはUTF-8、標準出力の文字コードANSI_X3.4-1968。
システムの標準出力の文字コードがおかしかったようです。
環境の変更はすぐにできなかったので下記のコマンドで正しい結果を得ました。
1 2 3 4 |
$ LANG=ja_JP.UTF-8 python3 hello.py utf-8 UTF-8 こんにちはこんにちは |
どの言語でも文字コードの問題は厄介ですね。
参考にしたURL:
http://d.hatena.ne.jp/heavenshell/20090219/1235057228
http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html