Pythonソースコードエンコーディングを定義する正しい方法


163

PEP 263は、Pythonソースコードエンコーディングの宣言方法を定義しています。

通常、Pythonファイルの最初の2行は次のように始まります:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

しかし、以下で始まる多くのファイルを見てきました。

#!/usr/bin/python
# -*- encoding: <encoding name> -*-

=> コードの代わりにコーディング

それでは、ファイルエンコーディングを宣言する正しい方法は何でしょうか。

されたエンコーディングが使用正規表現は怠け者なので許さ?それとも、ファイルエンコーディングを宣言するもう1つの形式ですか?

私がこの質問をしているのは、PEPがエンコードについて話しているのではなく、コーディングについて話しているだけだからです。


4
ちなみに、柔軟性と移植性を高めるため#!/usr/bin/env pythonに、次の代わりに使用することをお勧めします#!/usr/bin/python
glarrain

7
このページのどの回答にも、UTF8などの単純で実用的な例がないのが気に入っています。最高級のStackOverly。
aaa90210 2016年

2
Python 3がデフォルトのエンコーディングをからasciiに変更したことを追加したかっただけですUTF-8。比較:のpython 2.7のドキュメントのpython 3.7のドキュメントを。つまり、指定したい場合は、このエンコーディングを安全に省略できますUTF-8
gertvdijk

回答:


161

ここのドキュメントを確認してください

「Pythonスクリプトの1行目または2行目のcoding[=:]\s*([-\w.]+)コメントが正規表現と一致する場合、このコメントはエンコード宣言として処理されます」

「この表現の推奨形は

# -*- coding: <encoding-name> -*-

GNU Emacsでも認識されている

# vim:fileencoding=<encoding-name>

Bram MoolenaarのVIMによって認識されています。」

したがって、「コーディング」の部分の前にはほとんど何でも置くことができますが、100%python-docs-recommendation-compatibleにしたい場合は、「コーディング」(プレフィックスなし)を使用します。

より具体的には、Pythonが認識するものと使用する特定の編集ソフトウェアを使用する必要があります(必要なもの/すべてを受け入れる場合)。たとえば、codingフォームはGNU Emacsによって(そのまま)認識されますが、Vimによっては認識されません(そうです、普遍的な合意がない限り、それは本質的に芝生戦争です)。


10
なぜ-*-
Iulian Onofrei 2015年

10
これ-*-により、行がGNU Emacs(一部のプログラマーに人気のテキストエディター)によって確実に認識されます。この回答とは逆に、EmacsフォームとVimフォームはどちらも100%python-docs-recommendation-compatibleです(どちらも正規表現に一致するため、長年の慣例により「一致」とは、「文字列」、PythonのAPIとは逆です)。
martinjs

1
組み込みディレクティブに対する特定のEmacs要件は、gnu.org / software / emacs / manual / html_node / emacs /…に文書化されています。簡単に言うと、ファイルの先頭の形式は次のとおり<prefix>-*- var: value[; ...] -*-です。
ivan_pozdeev 2016

38

PEP 263:

1行目または2行目は、正規表現「coding [:=] \ s *([-\ w。] +)」と一致する必要があります

したがって、「encoding:UTF-8」が一致します。

PEPはいくつかの例を提供します:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

 

# This Python file uses the following encoding: utf-8
import os, sys

31

プログラムの上部にある以下のステートメントをコピーして貼り付けるだけで、文字エンコードの問題が解決されます

#!/usr/bin/env python
# -*- coding: utf-8 -*-

3

本日現在-2018年6月


PEP 263自体は、次の正規表現について言及しています。

ソースコードエンコーディングを定義するには、次のように、ファイルの1行目または2行目として、マジックコメントをソースファイルに配置する必要があります。

# coding=<encoding name>

または(人気のあるエディターによって認識されるフォーマットを使用):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

または:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> : 

より正確には、1行目または2行目は次の正規表現に一致する必要があります。

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

したがって、すでに他の回答で要約されているように、それはcoding任意のプレフィックスと一致しますが、PEP準拠になりたい場合は(私が知る限りencodingcodingは)、代わりにを使用して違反しません何らかの方法でPEP 263)— codingプレフィックスなしで 'plain' を使用します。


1

私が間違っていないのであれば、ソースファイルエンコーディングの最初の提案は、最初の数行に正規表現を使用することでした。

正規表現は、coding:その後に続くものに沿ったものだったと思います。

私はこれを見つけました:http : //www.python.org/dev/peps/pep-0263/ これは最初の提案ですが、彼らが何をしたかを正確に述べている最終的な仕様を見つけることができないようです。

私は確かencoding:に素晴らしい効果に慣れているので、明らかにそれはうまくいきます。

それが同様に機能duhcoding: ...するかどうかを確認するために、まったく異なるものに変更してみてください。


0

Rubyに似ていると思います。どちらの方法でも問題ありません。

これは主に、テキストエディターが異なると、エンコーディングのマーキングに異なる方法(つまり、これら2つ)を使用するためです。

Rubyでは、1番目、またはシバン行がある場合は2番目に一致する文字列が含まれている限り:

coding: encoding-name

これらの行の空白やその他の綿毛は無視します。(多くの場合、:ではなく=にすることもできます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.