python3.0におけるファイルのデフォルトencodingたのしいPython今夜コードを書いているすべてのヒトへプロフィールAuthor:辻真吾(つじしんご)www.tsjshg.infoいまは、大学の研究室を主な拠点に、色々やってます。このブログはPythonの話題が中心ですが、どちらかというと日々の仕事で使う知識を、自分のためにメモしたものです。万が一どなたかの役に立てば光栄です。githubgoogle-code-prettify管理者ページこのブログをリンクに追加するpython3.0におけるファイルのデフォルトencoding年をまたいで、Pythonいじって遊んでいたのですが、どうもPython3.0でのMacOSXにおけるバグっぽいものを見つけてしまったようなので、メモ程度に。fileを読み込むときのデフォルトのコーデックが、なぜかshift_jisになってしまっているようです。ちなみに、XPだと普通に動きますし、MacでもファイルをShift_jisで保存すればそのまま動きます。makeで入れたpythonですが、OSは10.4でも10.5でも同じでした。f.close();temp.txtは、UTF-8で保存されており、これをShift_jisにすると読めるので、おそらく組み込み関数openのデフォルトのencodingが、なぜかshift_jisになっていることが問題かと思われます。本家のバグレポートには、それっぽいエントリーはなかったのですが、報告するにはまだ調べが足りないかな。3.0なので、次のバージョンでこっそり直っていてくれると嬉しいですが。2009/1/4訂正Windowsでは動くと書きましたが、どうやら勘違い。Vista(SP1)とXP(SP3)ともに、デフォルトのfile読込時のcodecがcp932になっているようです。仕方ないので、組み込み関数openのソースを見てみました。Descriptorの番号に応じてencodingを返すようです。locale.getpreferredencoding()が、結局呼ばれる事になります。'X-MAC-JAPANESE')と、同じ。この名前が、Shift_JISにバインドされています。所謂、純粋なShift_JISで、Windows-31J(cp932)とは違います。ちなみに、windowsXPでは、おなじメソッドが今度は、'cp932'を返すので、ファイルを開くときにcodecがおかしくなる理由が何となくわかりました。Ubuntuだとすべて、UTF-8と返ってきて、問題まったくなし。んー、テストがLinuxで行われているのか?なんか、バグじゃなくて仕様のような気もしてきましたが、MacもWinも、できればデフォルトでUTF-8にして欲しいなー。思っていたら、やっぱり仕様でした。Python3.0より。なんと、環境ごとに気を遣ってくれているようです。(そんなんことしてくれなくていいのに・・・)というわけで、環境変数をいじります。__CF_USER_TEXT_ENCODINGとします。__CF_USER_TEXT_ENCODINGの設定方法は、いまひとつ掴みきれていませんが、:で挟まれた二つ目の引数が、1になっているところを、UTF-8を表す、0x08000100に変更すると、ファイルのデフォルトcodecがUTF-8になります。windowsは、だめですデフォルトのシステムロケールを変更できるのかどうかよくわかりません。知っている人いたら教えてください。MacでいろいろなPythonのバージョンをインストールする>>コメントコメントの投稿NAME:SUBJECT:MAIL:URL:COMMENT:PASS:SECRET:管理者にだけ表示を許可するトラックバックトラックバックURL→http://tanopy.blog79.fc2.com/tb.php/34-c499cf8eこの記事にトラックバックする(FC2ブログユーザー)[Python]こんにちは世界に一苦労Pythonの3.0を試してみたら日本語表示でドモった。エンコーディングがutf-8のhoge.txtというファイルの中身を表示させてみる。環境はMacOSX(10.4.11)とPython3.0.1。