SyntaxError: Non-ASCII karakter '\ xa3' dalam file ketika fungsi mengembalikan '£'


284

Katakanlah saya memiliki fungsi:

def NewFunction():
    return '£'

Saya ingin mencetak beberapa hal dengan tanda pound di depannya dan ia mencetak kesalahan ketika saya mencoba menjalankan program ini, pesan kesalahan ini ditampilkan:

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

Adakah yang bisa memberitahu saya bagaimana saya bisa memasukkan tanda pound dalam fungsi pengembalian saya? Saya pada dasarnya menggunakannya di kelas dan itu di '__str__'bagian yang termasuk tanda pound.


43
Apakah Anda bahkan membaca PEP yang ditautkan dengan Anda? Ini menjelaskan apa masalahnya dan bagaimana cara memperbaikinya.
murgatroid99

2
"Adakah yang bisa memberitahu saya bagaimana saya bisa memasukkan tanda pound dalam fungsi pengembalian saya." Nah, pesan kesalahan mengatakan "lihat python.org/peps/pep-0263.html untuk detail"; mungkin Anda harus mulai dari sana?
Karl Knechtel

5
@ murgatroid99 Inilah yang Anda dan pada saat saya ketik 27 ini tidak ada: Ya tentu saja saya akan membaca PEP. Tingkat kesulitan: Saya mencoba menjalankan / bin / sh terhadap wadah buruh pelabuhan. Saya tidak terang-terangan mencoba menjalankan Python. Jadi semua PEP akan memberi tahu saya adalah bagaimana memperbaiki kode python saya tidak mencoba untuk menjalankan dan tidak menulis. Saya berharap lebih banyak konteks dari StackOverflow, sebagai gantinya puas. :( Pencarian lebih lanjut menghasilkan jawaban yang sebenarnya: stackoverflow.com/questions/38992850/... - perhatikan bagaimana PEP benar-benar nol untuk membantu.
Mark Allen

@ Markallen - dalam jawaban Anda yang ditautkan, pesan kesalahan menunjukkan bahwa python sedang mencoba untuk menafsirkan "/ bin / bash" - ini memang sesuatu yang mudah untuk diabaikan, tetapi tidak ada dalam pertanyaan ini yang menunjukkan hubungannya dengan buruh pelabuhan atau wadah, jadi sarannya di sini karena Anda telah menemukan tidak berlaku untuk masalah Anda - itu bukan keangkuhan, hanya saja ada konteks dalam masalah Anda, itu tidak ada di sini.
Tanantish

@tanantish Saya mendukung apa yang saya katakan. Saya mendapat kesalahan dalam pertanyaan. Daripada memberikan informasi yang bermanfaat kepada orang-orang, ini disambut, "Apakah Anda bahkan membaca PEP yang ditautkan dengan Anda?" dan, "Yah pesan kesalahannya mengatakan lihat (bla), mungkin kamu harus mulai dari sana?" <- Respons itu tidak membantu. Saya tidak yakin mengapa kita melakukan diskusi ini.
Mark Allen

Jawaban:


368

Saya akan merekomendasikan membaca bahwa PEP kesalahan memberi Anda. Masalahnya adalah bahwa kode Anda mencoba menggunakan pengkodean ASCII, tetapi simbol pound bukan karakter ASCII. Coba gunakan pengkodean UTF-8. Anda dapat mulai dengan meletakkan # -*- coding: utf-8 -*-di bagian atas file .py Anda. Untuk menjadi lebih maju, Anda juga dapat menentukan pengkodean pada string demi string dalam kode Anda. Namun, jika Anda mencoba memasukkan tanda pound pound ke dalam kode Anda, Anda akan memerlukan pengkodean yang mendukungnya untuk seluruh file.


306

Menambahkan dua baris berikut, bagian atas skrip .py saya berfungsi untuk saya (baris pertama diperlukan):

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

Saya mendapat masalah yang sama dan Python saya adalah 2.7.11. Setelah menambahkan baris kedua # -*- coding: utf-8 -*-ke bagian atas file, itu menyelesaikan masalah.
hailong

2
Baris pertama adalah membuat file py dieksekusi di * nix. Ini tidak benar-benar terkait dengan pertanyaan ini.
cmd

57

Pertama-tama tambahkan # -*- coding: utf-8 -*-baris ke awal file dan kemudian gunakan u'foo'untuk semua data unicode non-ASCII Anda:

def NewFunction():
    return u'£'

atau gunakan sihir yang tersedia sejak Python 2.6 untuk menjadikannya otomatis:

from __future__ import unicode_literals

12
Jika sudah, # -*- coding: utf-8 -*-Anda tidak perlu mengawali string unicode Anda denganu
Daniel Lee

@ Plaes bagaimana kalau itu pada variabel? contoh dengan membaca file? Saya tidak dapat menggunakan uVariabel, bagaimana saya melakukannya?
Skizo-ozᴉʞS

1
@DanielLee Kecuali ini tidak benar. # -*- coding: utf-8 -*-diikuti oleh print 'błąd'akan menampilkan sampah, sambil print u'błąd'bekerja.
Przemek D

@DanielLee Apa yang Przemek D katakan. Menempatkan UTF-8 literal ke dalam kode sumber Anda seperti itu umumnya bukan ide yang baik, dan dapat menyebabkan perilaku yang tidak diinginkan, terutama dalam Python 2. Jika literal tidak murni ASCII 7 bit, mereka seharusnya Unicode aktual, bukan UTF-8, jadi dengan Python 2 Anda harus meletakkan uawalan pada literal tersebut. Dalam Python 3, string biasa adalah Unicode, tetapi uawalan diizinkan dalam versi terbaru dari Python 3 untuk membuatnya sedikit lebih mudah untuk menulis kode yang berperilaku benar di kedua Python 2 & 3.
PM 2Ring

12

Pesan kesalahan memberitahu Anda apa yang salah. Penerjemah Python perlu mengetahui pengkodean karakter non-ASCII.

Jika Anda ingin mengembalikan U + 00A3 maka Anda dapat mengatakan

return u'\u00a3'

yang mewakili karakter ini dalam ASCII murni melalui urutan pelepasan Unicode. Jika Anda ingin mengembalikan string byte yang berisi byte 0xA3 literal, itu

return b'\xa3'

(di mana dalam Python 2 bimplisit; tetapi eksplisit lebih baik daripada implisit).

PEP terkait dalam pesan kesalahan menginstruksikan Anda persis bagaimana untuk memberitahu Python "file ini bukan ASCII murni; inilah encoding Saya menggunakan". Jika pengkodeannya adalah UTF-8, itu akan menjadi

# coding=utf-8

atau yang kompatibel dengan Emacs

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

Jika Anda tidak tahu pengkodean yang digunakan editor untuk menyimpan file ini, periksa dengan sesuatu seperti hex editor dan beberapa googling. Stack Overflowtag memiliki halaman info tag dengan informasi lebih lanjut dan beberapa tips pemecahan masalah.

Dengan begitu banyak kata, di luar rentang ASCII 7-bit (0x00-0x7F), Python tidak bisa dan tidak boleh menebak string apa yang dilambangkan dengan urutan byte. https://tripleee.github.io/8bit#a3 menunjukkan 21 kemungkinan interpretasi untuk byte 0xA3 dan itu hanya dari pengodean 8-bit lama; tetapi bisa juga merupakan byte pertama dari multi-byte encoding. Tetapi pada kenyataannya, saya kira Anda benar-benar menggunakan Latin-1, jadi Anda harus melakukannya

# coding: latin-1

sebagai baris pertama atau kedua dari file sumber Anda. Lagi pula, tanpa pengetahuan tentang karakter byte yang seharusnya mewakili, manusia juga tidak akan bisa menebaknya.

Peringatan: coding: latin-1pasti akan menghapus pesan kesalahan (karena tidak ada urutan byte yang secara teknis tidak diizinkan dalam pengkodean ini), tetapi mungkin menghasilkan sepenuhnya hasil yang salah ketika kode ditafsirkan jika pengkodean sebenarnya adalah sesuatu yang lain. Anda benar-benar harus mengetahui penyandian file dengan kepastian lengkap ketika Anda mendeklarasikan penyandian.


Ini adalah adaptasi dari jawaban saya sebelumnya untuk pertanyaan rangkap: stackoverflow.com/a/50829958/874188
tripleee

Python 3 default ke UTF-8 untuk file sumber, dan Anda mungkin harus menggunakan UTF-8 untuk semuanya hari ini. utf8everywhere.org
tripleee

8

Menambahkan dua baris berikut dalam skrip memecahkan masalah untuk saya.

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

Semoga ini bisa membantu!


2

Anda mungkin mencoba menjalankan file Python 3 dengan interpreter Python 2. Saat ini (per 2019), pythonperintah default ke Python 2 ketika kedua versi diinstal, pada Windows dan sebagian besar distribusi Linux.

Tetapi jika Anda memang sedang mengerjakan skrip Python 2, solusi yang belum disebutkan pada halaman ini adalah menyimpan kembali file dalam pengkodean BOM UTF-8 +, yang akan menambahkan tiga byte khusus ke awal file, mereka akan informasikan secara eksplisit juru bahasa Python (dan editor teks Anda) tentang penyandian file.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.