Hatena::Grouppython

nelnal@python

2008-02-14

[][] py2exe で固めたファイルで UnicodeDecodeError その2 13:09  py2exe で固めたファイルで UnicodeDecodeError その2 - nelnal@python を含むブックマーク はてなブックマーク -  py2exe で固めたファイルで UnicodeDecodeError その2 - nelnal@python

前回 py2exe でEXEファイルを作成中に UnicodeDecodeError になったが、

今回は実行中に同エラーが発生。


ひとまずバックトレースで追ってみる。

エラーメッセージに「ASCII code (ほにゃほにゃ((忘れたw)))」と出てたので

該当行の文字列を unicode 型に指定した。

ついでに周辺の文字列も unicode 型に変更。

変更したソースを py2exe で固めて実行すると問題なく動く様になった。


py2exe ってどうも文字コードの判定が厳しいよなぁ。

pythonスクリプトそのものの型判定がゆるいので

どうしてもEXEファイル化した段階で問題が発生してしまう。

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20080214

2008-02-13

[] ファイル入出力時にエンコードを指定する 18:25  ファイル入出力時にエンコードを指定する - nelnal@python を含むブックマーク はてなブックマーク -  ファイル入出力時にエンコードを指定する - nelnal@python

組み込みの open 関数ではなく、codecs の open 関数を使う必要がある。


以下は Shift JIS で出力する場合

import codecs

file = codecs.open( "test.txt", "w", "shift_jis" )
file.write( u"test!! テスト!\n" )
参照
Python ライブラリリファレンス codecs

MinnieMinnie2011/07/28 00:01Many many qutaliy points there.

2007-12-25

[] 機種依存文字 19:21  機種依存文字 - nelnal@python を含むブックマーク はてなブックマーク -  機種依存文字 - nelnal@python

python機種依存文字*1が原因のエラーが発生。


python のエラーコードでは

UnicodeError: Shift_JIS decoding error: invalid character 0x8755

となっている。


回避方法についてあーだらこーだら考えたり検索してみたのだが、結局指定文字コードを変えれば良い模様。

というわけで対応文字コードを「Shift JIS (sjis)」から「Microsoft コードページ 932 (cp932)」に変更。

これで上手く動くようになった。


つーか、ファイル文字コード Shift JIS機種依存文字使うなよ。

諸般の事情により変更は出来ないので、しょうがないが・・・。


参考ページ
http://d.hatena.ne.jp/itasuke/20061228#p1
Microsoft コードページ 932 (Wikipedia)
http://ja.wikipedia.org/wiki/Windows-31J

*1:具体的には「ローマ数字の2」

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20071225

2007-11-14

[] 標準入出力の文字コードを変える 23:30  標準入出力の文字コードを変える - nelnal@python を含むブックマーク はてなブックマーク -  標準入出力の文字コードを変える - nelnal@python

標準出力をファイルにリダイレクトする際に

ファイルの文字エンコードShift_JIS に設定するのに今までは以下の様に行っていた。

$ python script | nkf > output_file

しかし、これだと自分は良いのだが余りCUIに慣れていない人に

余計な操作をさせることになるので何とか変えたいなぁ・・・と思っていたら

以下の方法を見つけた

参考
http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html

import sys, codecs

sys.stdin  = codecs.getreader( 'euc_jp' )( sys.stdin );
sys.stdout = codecs.getwriter( 'shift_jis' )( sys.stdout );

文字コードについては Python Library Reference の Codecs の項を参照とのこと。

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20071114