search
LoginSignup
51
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Pythonのcoding: ナントカのことがよく分からないから調べてみた

2行目に書くあの枕詞

とりあえず1行目にshebang書いて続けざまに2行目に書くアレ

haiku_wo_yome.py
#!/usr/bin/python
# -*- Coding: utf-8 -*-

Pythonのソースコードがどうエンコードされるべきか定義するおまじないめいた文である。
ちなみにこの例だとうまくいかない。Cが大文字だからだ。ハマった。

なんなんだ。一体coding: ナントカってなんなんだ。
ちょっと調べてみよう。

PEP 263を読みましょう

調べようと言ってみたが全てはPEP 263に書かれている。さすがPython。
というわけでかいつまんでみる。

そもそもなんで必要なのか

ざっくり書くと、
Python 2.1までユニコード文字を表記するにはエスケープシーケンスを使うしかなかった。8-bit文字なら好きなエンコーディングでいいけど限界あるよね。
…ということらしい。実際不便だ。Pythonでの文字コードの話はこの辺が参考になるかもしれない。UTF-8便利。

仕組み

デフォルトはASCII

エンコーディングについて何も指定がない場合はASCIIとして解釈される。
追記:Python3ではデフォルトでUTF-8(PEP 3120

1行目か2行目に書く

2行目でもいいのはshebangがあるためだろうか?

フォーマット

単純にこれでもいい。

simple.py
# coding=<encoding name>

よく使われるのは:

emacs.py
#!/opt/local/bin/python
# -*- coding: <encoding name> -*-

この表記はEmacs由来のようだ。vimだと:

vim.py
#!/emacs/or/vim/python
# vim: set fileencoding=<encoding name> :

どう書けば認識されるんよ?

実は1行目か2行目が次のパターンにマッチすると括弧内を文字コードとして認識する。1

"coding[:=]\s*([-\w.]+)"

なのでこれにマッチする書き方さえすればエディタとの整合が取れるようになっている。
他にも次のような表記が可能。

wazamae.py
#!/mongoose/vs/python
# This Python file uses the following encoding: utf-8
jillypoor.py
#!/neko/nadetai/python
# Current encoding: shift-jis is not good for this environment.

  1. \s : [ \t\n\r\f], \w : [_a-zA-Z0-9] 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
51
Help us understand the problem. What are the problem?