Hatena::ブログ(Diary)

主にプログラムを勉強するブログ

2012-01-22

Pythonで日本語が文字化けした場合のチェックポイント

このエントリは先日のエントリの補足的な内容となります。
先にそちらをお読みいただき、さらに404 Not Foundも確認した上で、それでも文字化けが発生してしまった場合チェックすべき点についての内容となります。

私自身も先のエントリで一通り確認したつもりだったのですが、再び文字化けが発生してしまい、アレ!?となったのでその点とググって確認した他の注意点とあわせてまとめてみました。
なお、基本的にはWindowsでの文字化けの場合となります。他の環境では私の力を超えますので(^_^;)

チェックポイント1.文字コード指定の書き方

私がやってしまっていたのがこれだったのですが、ファイルの先頭で文字コードを書く際

# coding: shift_jis

または

# coding= shift_jis

と書くのですが、このとき"coding:"と"coding="の部分は完全にこの通りでなければなりません。
"coding :"というように":"の前にスペースが入ったり、"Coding:"のように大文字になっていたりすると認識されません。
私の場合は":"の前後にはスペースを入れるクセがついていたのでダメだったようです。
また必ず一行目か二行目に書かなければなりません。
404 Not Foundで示されているようにそれ以外の部分に記号などが入るのは問題ないようです。

チェックポイント2.ファイルの保存時の文字コード

例えばコードの先頭で

# coding: shift_jis

と書いているのにファイル自体はutf-8で保存されている、というような場合です。これが発生しやすいのがメモ帳を使ってコードを書いている場合です。
メモ帳はデフォルトのまま保存すると"shift_jis"で保存されます。名前を付けて保存で"ANSI"となっているのは"shift_jis"のことです。またこれはメモ帳に限りませんが通常「上書き保存」を選ぶと文字コードは元のファイルのまま保存されるため、あるファイルを開いて文字コードを変更して保存しなおす場合は「上書き保存」ではなく新たに文字コードを指定しなければなりません。

チェックポイント3.コマンドプロンプトshift_jisしか表示できない

文字コードをテストする場合など、コマンドプロンプトを使用すると思うのですが、Windowsのコマンドプロンプトはデフォルトでは"shift_jis"モードになっており、Pythonのソースファイルが正しい記述であっても他の文字コードでは文字化けします。
例えば下のコードをutf-8で保存すればPythonファイルとしては正しい書き方ですがWindowsのコマンドプロンプトでは文字化けします。

# coding: utf-8
def HelloWorld():
  print "こんにちは"

if __name__=="__main__":
  HelloWorld()

コマンドプロンプトを"utf-8"モードにするには"chcp 65001"と入力します。
ところがこれをやっても文字化けしてしまいます。理由はフォントがないことなのですがフォントを入れるにはレジストリの操作が必要のようです。
コマンドプロンプトのプロパティ→フォントでMSゴシックを選択すれば文字化け自体は解消しますが今度はプログラムがPermisshon deniedというエラーになってしまいます。
レジストリを書き変える技量がなければ事実上コマンドプロンプトは"shift_jis"しか表示できないということですね。
Windows以外で作成されたファイルはまずまちがいなく"shift_jis"ではありませんのでネットで見つけたPythonファイルを書かれている通りに実行したのに文字化けしちゃう!と言う場合は高確率でこれが原因だと思います。
"shift_jis"以外の文字コードを指定する場合はかならずUnicode変換(u"文字列")を使いましょう。

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


画像認証

Connection: close