web-dev-qa-db-ja.com

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

私は機能があるとします。

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__'部分の中です。

245
SNIFFER_dog

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

341
Silas Ray

次の2行を追加すると、私の.pyスクリプトの上に座った(最初の行が必要でした)。

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

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

def NewFunction():
    return u'£'

あるいはPython 2.6以降で利用可能なマジックを使用して自動にします。

from __future__ import unicode_literals
54
plaes

エラーメッセージは何が悪いのかを正確に教えてくれます。 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進エディタやグーグルなどで調べてください。 Stack Overflow character-encoding tagには tag infoページ があります。

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

# coding: latin-1

ソースファイルの1行目または2行目として。いずれにせよ、バイトがどの文字を表すと想定されているかを知らずには、人間もこれを推測することはできません。

9
tripleee

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

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

0
user