Hatena::ブログ(Diary)

Memo

2009-02-19

[] Python3.0 で マルチバイト文字を print したらエラーになった

Python3.0 で以下のようなコードを書いて、実行したらエラーになった*1

#!/usr/bin/env python
# -*- coding: utf_8 -*-

print('こんにちはこんにちは')
$ python hello.py
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print('\u3053\u3093\u306b\u3061\u306f\u3053\u3093\u306b\u3061\u306f')
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/io.py", line 1491, in write
    b = encoder.encode(s)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/encodings/ascii.py", line 22, in encode
    return codecs.ascii_encode(input, self.errors)[0]
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

文字コード周りはあまり良く分らないので、とりあえずググったら、

この場合には、先ほどのsys.getdefaultencoding()で得られる文字コードエンコーディング)ではなく、環境変数LANG等のロケールで設定された文字コードを使ってエンコードされます。

PythonのUnicodeEncodeErrorを知る - HDEラボ

と出たので、先ほどのファイルに、

#!/usr/bin/env python
# -*- coding: utf_8 -*-

import sys
print(sys.getdefaultencoding())
print(sys.stdout.encoding)
print('こんにちはこんにちは')

を加えてみて、実行した。

$ python hello.py
utf-8
US-ASCII
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print('\u3053\u3093\u306b\u3061\u306f\u3053\u3093\u306b\u3061\u306f')
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/io.py", line 1491, in write
    b = encoder.encode(s)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/encodings/ascii.py", line 22, in encode
    return codecs.ascii_encode(input, self.errors)[0]
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

表示が US-ASCII になってる。


LANGが日本語のときには、想定された動きをします(LANGには端末で出力できる文字コードを設定してください)。

PythonのUnicodeEncodeErrorを知る - HDEラボ

シェルの env を確認したら、export LC_ALL=C となってた。

これを削除して、再度実行すると、

$ python hello.py
utf-8
UTF-8
こんにちはこんにちは

ちゃんと意図した通りになった。

*1Python は全くの未経験なためトンチンカンな事を書いてる可能性が高い

コナンコナン 2015/01/24 21:29 こんにちは、

私もpythonを使い始めたがやっぱりrssなど内容の特定できないものに対してはエラー出まくりです。
温泉マークやハートマーク、雪だるまマーク☃傘まーく☂の書き込みだとencodeエラーとなる。

文字変換などについてはutf-8に統一したがこれらのものに引っかかる。

回避方法ってありますか?
どうぞよろしくお願いします

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/heavenshell/20090219/1235057228