SyntaxError:関数が '£'を返す場合、ファイル内の非ASCII文字 '\ xa3'


284

私に機能があるとしましょう:

def NewFunction():
    return '£'

シャープ記号を前に付けて印刷したいのですが、このプログラムを実行しようとするとエラーが表示され、次のエラーメッセージが表示されます。

SyntaxError: Non-ASCII character '\xa3' in file 'blah' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details

誰でも、リターン関数にポンド記号を含める方法を教えてもらえますか?基本的にはクラスで使用しています'__str__'が、ポンド記号が含まれているのはその部分です。


43
リンクしたPEPを読んだことはありますか?それは問題が何であるか、そしてそれを修正する方法を説明します。
murgatroid99 2012年

2
「リターン関数にポンド記号を含める方法を誰かに教えてもらえますか。」まあ、エラーメッセージは「詳細についてはpython.org/peps/pep-0263.htmlを参照してください」と言っています。おそらくあなたはそこから始めるべきですか?
Karl Knechtel、2012年

5
@ murgatroid99ここにあなたと私がこれを入力したときの27が他にありません:はい、もちろんPEPを読みます。難易度:私はこれをDockerコンテナーに対して/ bin / shを実行しようとしました。私はあからさまにPythonを実行しようとはしていません。したがって、PEPが教えてくれるのは、実行しようとしておらず、作成しなかったpythonコードを修正する方法だけです。StackOverflowからより多くのコンテキストを求めていましたが、代わりに独善的でした。:(さらに検索すると、実際の答えが見つかりましたstackoverflow.com/questions/38992850/…-PEPがどのように正確にゼロになっているかに注目してください
Mark Allen

@MarkAllen-リンクされた回答のエラーメッセージは、Pythonが「/ bin / bash」を解釈しようとしていることを示しています-見落としがちなことは確かですが、この質問には、Dockerまたはコンテナに関係があることを示していないため、アドバイスあなたが見つけたここであなたの問題はあなたの問題には当てはまりません-それは独善的ではなく、あなたの問題にここに存在しないコンテキストがあるというだけです。
tanantish

@tanantish私は私が言ったことを支持します。質問に誤りがありました。これに出会った人々に役立つ情報を提供するのではなく、「あなたがリンクしたPEPを読んだことさえありますか?」そして、「まあ、エラーメッセージは、(まあ)参照してください、おそらくそこから開始する必要がありますか?」<-これらの回答は役に立ちません。なぜこのような議論が行われているのかはわかりません。
Mark Allen、

回答:


368

エラーがPEPに与えることを読むことをお勧めします。問題は、コードがASCIIエンコーディングを使用しようとしているが、ポンド記号がASCII文字ではないことです。UTF-8エンコーディングを使用してみてください。まず# -*- coding: utf-8 -*-、.pyファイルの先頭に配置します。さらに高度な方法として、コードで文字列ごとにエンコーディングを定義することもできます。ただし、シャープ記号リテラルをコードに挿入する場合は、ファイル全体でそれをサポートするエンコードが必要です。


306

次の2行を追加すると、私の.pyスクリプトの先頭に配置されました(最初の行が必要でした)。

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

同じ問題が発生し、Pythonは2.7.11です。# -*- coding: utf-8 -*-ファイルの先頭に2行目を追加すると、問題が解決しました。
hailong 2016年

2
1行目は、* nixでpyファイルを実行可能にすることです。これは実際にはこの質問とは関係ありません。
cmd

57

最初に# -*- coding: utf-8 -*-ファイルの先頭に行を追加してから、u'foo'すべての非ASCII Unicodeデータに使用します。

def NewFunction():
    return u'£'

または、Python 2.6以降で利用可能な魔法を使用して自動化します。

from __future__ import unicode_literals

12
あなたが持っている場合は# -*- coding: utf-8 -*-、あなたとあなたのUnicode文字列の前に付ける必要はありませんu
ダニエル・リー

変数にある場合はどうですか?ファイルを読み取ることによる例?uVariableを使用できません。どうすればよいですか?
Skizo-ozᴉʞS

1
@DanielLeeこれが真実でないことを除いて。# -*- coding: utf-8 -*-が動作しているprint 'błąd'間、その後にゴミが出力されますprint u'błąd'
Przemek D 2017

@DanielLee Przemek Dが言ったこと。UTF-8リテラルをそのようにソースコードに挿入することは、一般に良い考えではなく、特にPython 2で望ましくない動作を引き起こす可能性があります。リテラルが純粋な7ビットASCIIでない場合、UTF-8ではなく実際のUnicodeである必要があります。したがって、Python 2ではu、そのようなリテラルに接頭辞を付ける必要があります。Pythonの3では、プレーンな文字列は、とにかくUnicodeのですが、u接頭辞は、Pythonの2&3の両方で正しく振る舞う書き込みコードにそれが少し楽にするためにはPython 3の最近のバージョンでは許可されている
PM 2Ring

12

エラーメッセージは、何が問題かを正確に伝えます。Pythonインタープリターは、非ASCII文字のエンコードを知っている必要があります。

U + 00A3を返したい場合は、

return u'\u00a3'

これは、Unicodeエスケープシーケンスを介してこの文字を純粋なASCIIで表します。リテラルバイト0xA3を含むバイト文字列を返したい場合は、

return b'\xa3'

(Python 2ではb暗黙的ですが、明示的の方が暗黙的より優れています)。

エラーメッセージ内のリンクされたPEPは、Pythonに「このファイルは純粋なASCIIではありません。ここで使用しているエンコーディングです」と正確に伝える方法を示しています。エンコーディングがUTF-8の場合、それは

# coding=utf-8

またはEmacs互換

# -*- encoding: utf-8 -*-

エディターがこのファイルを保存するために使用するエンコーディングがわからない場合は、16進エディターやグーグルなどで調べてください。スタックオーバーフロータグには、詳細情報とトラブルシューティングのヒントが記載されたタグ情報ページがあります。

非常に多くの言葉で、7ビットのASCII範囲(0x00-0x7F)の外では、Pythonはバイトのシーケンスが表す文字列を推測することはできません。https://tripleee.github.io/8bit#a3は、バイト0xA3の21の可能な解釈を示しています。これは、レガシー8ビットエンコーディングからのものです。ただし、マルチバイトエンコーディングの最初のバイトにもなる可能性があります。しかし、実際には、実際にはLatin-1を使用していると思いますので、

# coding: latin-1

ソースファイルの1行目または2行目。とにかく、バイトが表す文字がわからない場合、人間もこれを推測できません。

警告:coding: latin-1エラーメッセージは確実に削除されます(このエンコーディングでは技術的に許可されていないバイトシーケンスがないため)が、実際のエンコーディングが他のものである場合、コードが解釈されると完全に誤った結果が生成される可能性があります。エンコーディングを宣言するときは、ファイルのエンコーディングを完全に確実に知る必要があります。


これは、重複した質問への私の以前の回答を適応したものです:stackoverflow.com/a/50829958/874188
tripleee

Python 3のデフォルトでは、ソースファイルのUTF-8が使用されます。いずれにしても、最近はすべてUTF-8を使用しているはずです。utf8everywhere.org
tripleee

8

スクリプトに次の2行を追加すると、問題が解決しました。

# !/usr/bin/python
# coding=utf-8

それが役に立てば幸い !


2

Python 2インタープリターでPython 3ファイルを実行しようとしている可能性があります。現在(2019現在)、pythonWindowsとほとんどのLinuxディストリビューションに両方のバージョンがインストールされている場合、コマンドはデフォルトでPython 2になります。

しかし、実際にPython 2スクリプトで作業している場合、このページのソリューションではまだ言及されていませんが、ファイルをUTF-8 + BOMエンコードで再保存することで、ファイルの先頭に3つの特別なバイトが追加されます。ファイルのエンコードについて、Pythonインタープリター(およびテキストエディター)に明示的に通知します。

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