पायथन स्रोत कोड एन्कोडिंग को परिभाषित करने का सही तरीका


163

PEP 263 परिभाषित करता है कि पायथन स्रोत कोड एन्कोडिंग की घोषणा कैसे करें।

आम तौर पर, पायथन फ़ाइल की पहली 2 पंक्तियों के साथ शुरू होना चाहिए:

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

लेकिन मैंने बहुत सी फाइलें देखी हैं जो शुरू होती हैं:

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

=> एन्कोडिंग के बजाय कोडिंग

तो फ़ाइल एन्कोडिंग घोषित करने का सही तरीका क्या है?

है एन्कोडिंग की अनुमति दी क्योंकि इस्तेमाल किया regex आलसी है? या यह फ़ाइल एन्कोडिंग घोषित करने का सिर्फ एक और रूप है?

मैं यह सवाल पूछ रहा हूं क्योंकि पीईपी एन्कोडिंग के बारे में बात नहीं करता है , यह सिर्फ कोडिंग के बारे में बात करता है ।


4
वैसे, अधिक लचीलेपन और पोर्टेबिलिटी के लिए इसका उपयोग #!/usr/bin/env pythonकरने की सिफारिश की जाती है#!/usr/bin/python
glarrain

7
मुझे इस पेज पर जिस तरह से कोई भी उत्तर पसंद नहीं है, वह यूटीएफ 8 के लिए एक सरल, काम करने वाला उदाहरण है। StackOverly अपने सबसे अच्छे रूप में।
आका 90210

2
मैं बस यह जोड़ना चाहता था कि पायथन 3 ने डिफ़ॉल्ट एन्कोडिंग को इससे बदल दिया asciiहै UTF-8। तुलना करें: अजगर 3.7 डॉक्स के साथ अजगर 2.7 डॉक्स । इसका मतलब है कि यदि आप निर्दिष्ट करना चाहते हैं तो आप इस एन्कोडिंग को सुरक्षित रूप से छोड़ सकते हैं UTF-8
gertvdijk

जवाबों:


161

डॉक्स यहां देखें :

"यदि पायथन स्क्रिप्ट की पहली या दूसरी पंक्ति में एक टिप्पणी नियमित अभिव्यक्ति से मेल खाती है coding[=:]\s*([-\w.]+), तो इस टिप्पणी को एन्कोडिंग के रूप में संसाधित किया जाता है"

"इस अभिव्यक्ति के अनुशंसित रूप हैं

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

जिसे GNU Emacs द्वारा मान्यता प्राप्त है, और

# vim:fileencoding=<encoding-name>

जिसे ब्राम मूलनेर के VIM द्वारा मान्यता प्राप्त है। "

तो, आप "कोडिंग" भाग से पहले बहुत कुछ डाल सकते हैं, लेकिन यदि आप 100% अजगर-डॉक्स-सिफारिश-संगत होना चाहते हैं तो "कोडिंग" (बिना किसी उपसर्ग के) से चिपके रहें।

विशेष रूप से, आपको पायथन द्वारा मान्यता प्राप्त और आपके द्वारा उपयोग किए जाने वाले विशिष्ट संपादन सॉफ़्टवेयर का उपयोग करने की आवश्यकता है (यदि इसे किसी भी चीज़ की आवश्यकता है / स्वीकार करता है)। जैसे कि codingफॉर्म को GNU Emacs द्वारा मान्यता प्राप्त है (बॉक्स से बाहर) लेकिन विम नहीं (हाँ, एक सार्वभौमिक समझौते के बिना, यह अनिवार्य रूप से एक टर्फ युद्ध है )।



10
यह -*-सुनिश्चित करता है कि रेखा को GNU Emacs (कुछ प्रोग्रामर्स के साथ लोकप्रिय टेक्स्ट एडिटर) द्वारा मान्यता प्राप्त है। ध्यान दें कि, इस उत्तर के विपरीत, दोनों Emacs फॉर्म और Vim फॉर्म 100% पायथन-डॉक्स-सिफारिश-संगत हैं (क्योंकि वे दोनों regexp से मेल खाते हैं - "मैच", लंबे समय तक चलने वाले सम्मेलन द्वारा, "कहीं भी मेल खाते हैं"। स्ट्रिंग ", पायथन एपीआई के विपरीत)।
मार्टिनेज

1
एम्बेडेड निर्देशों के लिए विशिष्ट Emacs आवश्यकताओं को gnu.org/software/emacs/manual/html_node/emacs/… पर प्रलेखित किया गया है । संक्षेप में, फ़ाइल की शुरुआत के लिए प्रारूप है <prefix>-*- var: value[; ...] -*-:।
ivan_pozdeev

38

पीईपी 263:

पहली या दूसरी पंक्ति को नियमित अभिव्यक्ति "कोडिंग [: =] \ _ * ([- \ w।] +) से मेल खाना चाहिए।"

तो, "एन कोडिंग: 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

आज तक - जून २०१ 201


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किसी भी उपसर्ग के साथ मेल खाएगा , लेकिन यदि आप पीईपी-अनुरूप होना चाहते हैं, तो यह (भले ही मैं बता सकता हूं, encodingइसके बजाय का उपयोग करके codingउल्लंघन नहीं करता है पीईपी 263 किसी भी तरह से) - codingबिना किसी उपसर्ग के, 'प्लेन' से चिपके रहते हैं ।


1

अगर मैं गलत नहीं हूं, तो स्रोत फ़ाइल एन्कोडिंग के लिए मूल प्रस्ताव पहले जोड़े के लिए एक नियमित अभिव्यक्ति का उपयोग करना था, जो दोनों की अनुमति देगा।

मुझे लगता है कि रेगेक्स कुछ के बाद की लाइनों के साथ coding:कुछ था।

मुझे यह मिला: http://www.python.org/dev/peps/pep-0263/ जो मूल प्रस्ताव है, लेकिन मुझे लगता है कि वे क्या कर रहे थे बताते हुए अंतिम कल्पना नहीं मिल सकती है।

मैंने निश्चित रूप encoding:से महान प्रभाव का उपयोग किया है, इसलिए जाहिर है कि यह काम करता है।

कुछ पूरी तरह से अलग करने के लिए बदलने की कोशिश करें, duhcoding: ...यह देखना है कि क्या यह भी काम करता है।


0

मुझे संदेह है कि यह रूबी के समान है - या तो विधि ठीक है।

यह बड़े पैमाने पर है क्योंकि अलग-अलग पाठ संपादक अलग-अलग तरीकों (यानी, इन दोनों) को एन्कोडिंग के अंकन का उपयोग करते हैं।

रूबी के साथ, जब तक कि पहली, या दूसरी अगर एक शेबंग लाइन होती है, जिसमें एक स्ट्रिंग होती है, जो मेल खाती है:

coding: encoding-name

और उन रेखाओं पर किसी भी व्हाट्सएप और अन्य फ़्लफ़ को अनदेखा करना। (यह अक्सर हो सकता है = के बजाय:, भी)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.