UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6:
ordinal not in range(128)
ASCII(アスキー)をデコードしようと思ったけど、できなかった、ということのようです。
プログラムを実行するとこのようになります。
$ python parse.py
Traceback (most recent call last):
File "parse.py", line 210, in <module>
parser.feed(html)
File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed
self.goahead(0)
File "/usr/local/lib/python2.7/HTMLParser.py", line 148, in goahead
k = self.parse_starttag(i)
File "/usr/local/lib/python2.7/HTMLParser.py", line 252, in parse_starttag
attrvalue = self.unescape(attrvalue)
File "/usr/local/lib/python2.7/HTMLParser.py", line 393, in unescape
return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)
File "/usr/local/lib/python2.7/re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6:
ordinal not in range(128)
Exit 1
なところを
foo ( str.decode('utf-8') );
とするだけで、解決しました。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)
エラーが起きたとき
出力をリダイレクトしない場合は、問題にならなかったのですが、リダイレクトした瞬間に
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6:
ordinal not in range(128)
とエラーが出るようになりました。
% python ./parse.py < foo.txt
% python ./parse.py < foo.txt > bar.txt
Traceback (most recent call last):
File "./parse.py", line 210, in <module>
parser.feed(html.decode('utf-8') )
File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed
self.goahead(0)
File "/usr/local/lib/python2.7/HTMLParser.py", line 150, in goahead
k = self.parse_endtag(i)
File "/usr/local/lib/python2.7/HTMLParser.py", line 319, in parse_endtag
self.handle_endtag(tag.lower())
File "./parse.py", line 128, in handle_endtag
print self.expression, ",", self.meaning,
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)
Exit 1
解決方法1
出力先が端末、ファイルに関わらず、特定のエンコーディングで出力したい場合は、標準出力で書き換えてしまうのが簡単です。
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
解決方法2
解決方法1で解決しなかった場合は、コードの変更はなく、環境変数を設定するだけで対応できました。
env LC_ALL=en_US.UTF-8 /usr/bin/python ./doit.py