파이썬 소스 코드 인코딩을 정의하는 올바른 방법


163

PEP 263 은 Python 소스 코드 인코딩을 선언하는 방법을 정의합니다.

일반적으로 파이썬 파일의 처음 두 줄은 다음으로 시작해야합니다.

#!/usr/bin/python
# -*- coding: <encoding name> -*-

그러나 나는 다음으로 시작하는 많은 파일을 보았습니다.

#!/usr/bin/python
# -*- encoding: <encoding name> -*-

=> 코딩 대신 코딩 .

그렇다면 파일 인코딩을 선언하는 올바른 방법은 무엇입니까?

되어 인코딩하는 데 사용되는 정규식 게으른 때문에 허용? 아니면 파일 인코딩을 선언하는 또 다른 형태입니까?

PEP는 인코딩 에 대해 이야기하지 않고 코딩에 대해서만 이야기하기 때문에이 질문을 하고 있습니다 .


4
그건 그렇고, 더 많은 유연성과 휴대 성을 위해 #!/usr/bin/env python대신 사용 하는 것이 좋습니다#!/usr/bin/python
glarrain

7
이 페이지의 답변 중 UTF8과 같은 간단한 작동 예제가없는 방법을 좋아합니다. 최고급 스택.
aaa90210

2
방금 Python 3이 기본 인코딩을에서 ascii로 변경했다는 것을 추가하고 싶었 습니다 UTF-8. 파이썬 3.7 문서파이썬 2.7 문서 를 비교하십시오 . 즉,을 지정하려는 경우이 인코딩을 안전하게 생략 할 수 있습니다 . UTF-8
gertvdijk '12

답변:


161

여기 에서 문서를 확인 하십시오 .

"Python 스크립트의 첫 번째 또는 두 번째 행에있는 coding[=:]\s*([-\w.]+)주석이 정규식과 일치하면 이 주석은 인코딩 선언으로 처리됩니다."

"이 표현의 권장 형태는

# -*- coding: <encoding-name> -*-

이것은 GNU Emacs에서도 인정합니다.

# vim:fileencoding=<encoding-name>

Bram Moolenaar의 VIM에 의해 인식됩니다. "

따라서 "코딩"부분 앞에는 거의 모든 것을 넣을 수 있지만 100 % python-docs-recommendation-compatible가 되려면 "코딩"(접두사가없는)을 고수하십시오.

보다 구체적으로, 파이썬이 인식하는 모든 것을 사용하고 사용 하는 특정 편집 소프트웨어 (아무것도 필요로하는 경우) 를 사용해야 합니다. 예를 들어, coding폼은 GNU Emacs에 의해 인식되지만 Vim은 인식하지 못합니다 (예, 보편적 인 합의가 없다면 본질적으로 잔디 전쟁입니다 ).


10
-*-?
Iulian Onofrei

10
-*-라인은 GNU Emacs (일부 프로그래머에게 인기있는 텍스트 편집기)에 의해 라인이 인식되도록합니다. 이 답변과 달리 Emacs 양식과 Vim 양식은 100 % python-docs-recommendation-compatible입니다. 문자열 ", Python의 API와 달리).
martinjs

1
임베디드 지시문에 대한 특정 Emacs 요구 사항은 gnu.org/software/emacs/manual/html_node/emacs/…에 문서화되어 있습니다 . 간단히 말해 파일 시작 형식은 다음과 같습니다 <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev

38

PEP 263 :

첫 번째 또는 두 번째 행은 정규식 "coding [: =] \ s * ([-\ w.] +)"와 일치해야합니다.

따라서 "en coding : UTF-8 "이 일치합니다.

PEP는 몇 가지 예를 제공합니다.

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

 

# This Python file uses the following encoding: utf-8
import os, sys

31

프로그램 상단에 아래 문장을 복사하면 문자 인코딩 문제가 해결됩니다.

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

3

오늘 기준 — 2018 년 6 월


PEP 263 자체는 다음과 같은 정규 표현식을 언급합니다.

소스 코드 인코딩을 정의하려면 다음과 같이 매직 주석을 파일의 첫 번째 또는 두 번째 행으로 소스 파일에 배치해야합니다.

# coding=<encoding name>

또는 (인기있는 편집자가 인식하는 형식 사용) :

#!/usr/bin/python
# -*- coding: <encoding name> -*-

또는:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> : 

보다 정확하게는 첫 번째 또는 두 번째 줄은 다음 정규식과 일치해야합니다.

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

따라서 이미 다른 답변에 의해 요약 된 것처럼 coding모든 접두사와 일치 하지만 PEP를 준수하려는 경우 (내가 말할 수있는 한, encoding대신 사용 하는 coding것이 위반되지 않습니다) PEP 263)) — coding접두사없이 'plain'을 사용하십시오.


1

내가 실수하지 않으면 소스 파일 인코딩에 대한 원래 제안은 첫 두 줄에 정규 표현식을 사용하는 것이 었습니다.

나는 정규식이 무언가를 따르는 줄에 따른 것이라고 생각합니다 coding:.

나는 이것을 발견했다 : http://www.python.org/dev/peps/pep-0263/ 이것은 원래의 제안이지만, 그들이 한 일을 정확하게 나타내는 최종 사양을 찾을 수없는 것 같습니다.

나는 분명히 encoding:큰 효과를 보았으므로 분명히 효과가 있습니다.

duhcoding: ...잘 작동하는지 확인하기 위해 완전히 다른 것으로 변경 하십시오.


0

나는 그것이 Ruby와 비슷하다고 생각합니다-어느 쪽이든 괜찮습니다.

텍스트 편집기마다 서로 다른 마킹 인코딩 방법 (즉,이 두 가지)을 사용하기 때문입니다.

루비를 사용하면 첫 번째 줄이나 두 번째 줄에 다음과 일치하는 문자열이 포함됩니다.

coding: encoding-name

그 줄에 공백과 다른 보풀을 무시합니다. (이것은 종종 : 대신 = 일 수도 있습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.