[python] 구문 오류 : 함수가 ‘£’를 반환 할 때 파일에 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__'파운드 기호가 포함되어 있습니다.



답변

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


답변

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

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


답변

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

def NewFunction():
    return u'£'

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

from __future__ import unicode_literals


답변

오류 메시지는 정확히 무엇이 잘못되었는지 알려줍니다. 파이썬 인터프리터는 비 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이 인코딩에서 기술적으로 허용되지 않는 바이트 시퀀스가 ​​없기 때문에 오류 메시지를 확실히 제거하지만 실제 인코딩이 다른 코드 인 경우 코드가 해석 될 때 완전히 잘못된 결과를 생성 할 수 있습니다. 인코딩을 선언 할 때 파일의 인코딩을 확실하게 알고 있어야합니다.


답변

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

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

그것이 도움이되기를 바랍니다!


답변

Python 2 인터프리터로 Python 3 파일을 실행하려고합니다. 현재 (2019 년 기준) pythonWindows와 대부분의 Linux 배포판에 두 버전이 모두 설치되어 있으면 명령의 기본값은 Python 2입니다.

그러나 실제로 Python 2 스크립트를 작업하는 경우이 페이지 솔루션에서 아직 언급하지 않은 파일은 UTF-8 + BOM 인코딩으로 파일을 다시 저장하는 것입니다. 파일 시작 부분에 3 개의 특수 바이트가 추가됩니다. 파일 인코딩에 대해 Python 인터프리터 및 텍스트 편집기에 명시 적으로 알리십시오.


답변