구문 오류 : 함수가 '£'를 반환 할 때 파일에 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

2
"누구라도 리턴 함수에 파운드 기호를 포함시킬 수있는 방법을 알려주십시오." 오류 메시지는 "자세한 내용은 python.org/peps/pep-0263.html "을 참조하십시오 . 아마도 거기서 시작해야합니까?
Karl Knechtel

5
@ murgatroid99 여기에 입력 한 27 명의 다른 사람들이 누락되었습니다. 물론 PEP를 읽겠습니다. 난이도 : 도커 컨테이너에 대해 / bin / sh를 실행하려고했습니다. 나는 명백하게 파이썬을 실행하려고하지 않습니다. 그래서 모든 PEP는 내가 실행하려고하지 않고 쓰지 않은 파이썬 코드를 수정하는 방법입니다. 나는 StackOverflow에서 더 많은 컨텍스트를 원하고 대신 밀수를 얻었습니다. :( 추가 검색 결과 실제 답이 나타났습니다 : stackoverflow.com/questions/38992850/…-PEP 가 정확히 0을 달성하는 방법을 확인하십시오.
Mark Allen

@MarkAllen-링크 된 답변에서 오류 메시지는 파이썬이 "/ bin / bash"를 해석하려고한다는 것을 나타냅니다. 간단히 간과하기 쉽지만 질문에는 도커 또는 컨테이너와 관련 있음을 나타내지 않으므로 조언 발견 한대로 문제에 적용되지 않습니다-그것은 밀착성이 아니며 문제에 대한 맥락이 있다는 것입니다.
tanantish

@tanantish 나는 내가 말한 것을 기다립니다. 질문에 오류가 있습니다. 사람들에게 유용한 정보를 제공하기보다는 "연결된 PEP를 읽었습니까?" "오류 메시지가 (blah)를 참조하십시오. 아마도 거기서 시작해야합니까?" <-이 답변은 도움이되지 않습니다. 왜 우리가이 토론을하는지 모르겠습니다.
Mark Allen

답변:


368

PEP에 오류가 있음을 읽는 것이 좋습니다. 문제는 코드에서 ASCII 인코딩을 사용하려고하지만 파운드 기호가 ASCII 문자가 아니라는 것입니다. UTF-8 인코딩을 사용해보십시오. # -*- coding: utf-8 -*-.py 파일의 맨 위에 놓아 시작할 수 있습니다 . 더 발전시키기 위해 코드에서 문자열을 기준으로 인코딩을 정의 할 수도 있습니다. 그러나 파운드 기호 리터럴을 코드에 넣으려는 경우 전체 파일에 대해이를 지원하는 인코딩이 필요합니다.


306

다음 두 줄을 추가하면 내 .py 스크립트 상단에 앉았습니다 (첫 번째 줄이 필요했습니다).

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

나는 같은 문제가 있고 파이썬은 2.7.11입니다. # -*- coding: utf-8 -*-파일 맨 위에 두 번째 줄 을 추가 한 후 문제가 해결되었습니다.
hailong

2
첫 번째 줄은 * nix에서 py 파일을 실행 가능하게 만드는 것입니다. 실제로이 질문과 관련이 없습니다.
cmd

57

먼저 # -*- coding: utf-8 -*-파일의 시작 부분에 행을 추가 한 다음 u'foo'모든 비 ASCII 유니 코드 데이터에 사용하십시오.

def NewFunction():
    return u'£'

또는 Python 2.6부터 사용 가능한 마법을 사용하여 자동으로 만듭니다.

from __future__ import unicode_literals

12
# -*- coding: utf-8 -*-유니 코드 문자열을 앞에 붙일 필요 가 없다면u
Daniel Lee

@가 변수에 있다면 어떨까요? 예를 들어 파일을 읽음으로써? uVariable을 사용할 수 없습니다. 어떻게해야합니까?
Skizo-ozᴉʞS

1
@DanielLee 이것은 사실이 아닙니다. # -*- coding: utf-8 -*-다음에 print 'błąd', 잠시 의지 출력 쓰레기 print u'błąd'작동합니다.
Przemek D

@DanielLee Przemek D가 말한 것. UTF-8 리터럴을 소스 코드에 넣는 것은 일반적으로 좋은 생각이 아니며 특히 Python 2에서 원하지 않는 동작을 유발할 수 있습니다. 리터럴이 순수한 7 비트 ASCII가 아닌 경우 UTF-8이 아닌 실제 유니 코드 여야합니다. 파이썬 2 u에서는 그러한 리터럴에 접두사를 붙여야합니다. 파이썬 3에서 일반 문자열은 어쨌든 유니 코드이지만, u최신 버전의 파이썬 3에서는 접두사가 허용되어 파이썬 2와 3에서 올바르게 동작하는 코드를 조금 더 쉽게 작성할 수 있습니다.
PM 2Ring

12

오류 메시지는 정확히 무엇이 잘못되었는지 알려줍니다. 파이썬 인터프리터는 비 ASCII 문자의 인코딩을 알아야합니다.

U + 00A3 을 반환 하려면 다음과 같이 말할 수 있습니다.

return u'\u00a3'

이것은 유니 코드 이스케이프 시퀀스를 통해 순수한 ASCII로이 문자를 나타냅니다. 리터럴 바이트 0xA3을 포함하는 바이트 문자열을 반환하려는 경우

return b'\xa3'

(파이썬 2에서는 b암시 적이지만 명시 적은 암시 적보다 낫습니다).

오류 메시지의 링크 된 PEP는 Python에게 "이 파일은 순수한 ASCII가 아닙니다. 여기에 내가 사용중인 인코딩이 있습니다"라고 알려주는 방법을 정확하게 알려줍니다. 인코딩이 UTF-8 인 경우

# coding=utf-8

또는 이맥스 호환

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

편집기에서이 파일을 저장하는 데 사용하는 인코딩을 모르는 경우 16 진 편집기 및 인터넷 검색과 같은 형식으로 검사하십시오. 스택 오버플로태그에는 자세한 정보와 문제 해결 팁 이 포함 된 태그 정보 페이지 가 있습니다.

7 비트 ASCII 범위 (0x00-0x7F) 이외의 많은 단어에서 파이썬은 일련의 바이트가 나타내는 문자열을 추측 할 수 없으며 추측해서는 안됩니다. https://tripleee.github.io/8bit#a3 은 바이트 0xA3에 대한 21 가지 가능한 해석을 보여 주며 레거시 8 비트 인코딩에서만 제공됩니다. 그러나 멀티 바이트 인코딩의 첫 번째 바이트 일 수도 있습니다. 그러나 실제로는 실제로 Latin-1을 사용하고 있다고 생각하므로

# coding: latin-1

소스 파일의 첫 번째 또는 두 번째 줄로. 어쨌든 바이트가 어떤 문자를 나타내는 지 알지 못하면 인간도 이것을 추측 할 수 없습니다.

주의 사항 : coding: latin-1이 인코딩에서 기술적으로 허용되지 않는 바이트 시퀀스가 ​​없기 때문에 오류 메시지를 확실히 제거하지만 실제 인코딩이 다른 코드 인 경우 코드가 해석 될 때 완전히 잘못된 결과를 생성 할 수 있습니다. 인코딩을 선언 할 때 파일의 인코딩을 확실하게 알고 있어야합니다.


이것은 중복 질문에 대한 나의 이전 답변의 적응입니다 : stackoverflow.com/a/50829958/874188
tripleee

Python 3은 기본적으로 소스 파일의 경우 UTF-8로 설정되며 요즘에는 모든 것에 UTF-8을 사용해야합니다. utf8everywhere.org
tripleee

8

스크립트에 다음 두 줄을 추가하면 문제가 해결되었습니다.

# !/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.