2010-10-25 20 views
22

पाइथन में sys.argv के तत्व कौन से एन्कोडिंग हैं? क्या वे sys.getdefaultencoding() एन्कोडिंग के साथ एन्कोड किए गए हैं?पायथन: sys.argv प्रसंस्करण के लिए कौन सी एन्कोडिंग का उपयोग किया जाता है?

sys.getdefaultencoding(): यूनिकोड कार्यान्वयन द्वारा उपयोग किए जाने वाले वर्तमान डिफ़ॉल्ट स्ट्रिंग एन्कोडिंग का नाम लौटाएं।

पुनश्च: जैसा कि कुछ उत्तर में बताया, sys.stdin.encoding वास्तव में एक बेहतर लगता होगा। मुझे इस सवाल का एक निश्चित जवाब देखना अच्छा लगेगा, हालांकि, ठोस स्रोतों के संकेतकों के साथ!

पी पी एस: विम के रूप में बताया, अजगर 3 sys.argv में str वस्तुओं रखकर इस समस्या को हल करती है (अगर मैं सही ढंग से समझ)। सवाल हालांकि Python 2.x के लिए खुला रहता है। यूनिक्स के तहत, LC_CTYPE पर्यावरण चर जांचने के लिए सही चीज़ प्रतीत होता है, नहीं? विंडोज के साथ क्या किया जाना चाहिए (ताकि sys.argv तत्वों को कंसोल जो भी कंसोल किया गया हो)?

उत्तर

3

"विंडोज के साथ क्या किया जाना चाहिए (ताकि sys.argv तत्वों को कंसोल जो भी कंसोल किया गया हो)?"

पायथन 2.x के लिए, this comment on issue2128 देखें।

(ध्यान दें कि कोई एन्कोडिंग मूल sys.argv के लिए सही है, क्योंकि कुछ अक्षर तरीकों से विकृत किए गए हो सकते हैं वहाँ पूर्ववत करने के लिए पर्याप्त जानकारी नहीं है कि, उदाहरण के लिए, एएनएसआई कोड पृष्ठ पर तो ग्रीक अल्फा का प्रतिनिधित्व नहीं कर सकते इसे 'ए' में उलझाया जाएगा।)

+0

स्वीकृत के रूप में चिह्नित: समस्या 2128 पर यह नई टिप्पणी नई जानकारी है! धन्यवाद! – EOL

4

यूनिक्स सिस्टम पर, यह उपयोगकर्ता के लोकेल में होना चाहिए, जो कि (अजीब तरह से) sys.getdefaultencoding से बंधे नहीं है। http://docs.python.org/library/locale.html देखें।

विंडोज़ में, यह सिस्टम एएनएसआई कोडपेज में होगा।

(वैसे, उन प्राथमिक स्कूल के शिक्षकों को जो एक पूर्वसर्ग आप के लिए झूठ बोल रहे थे के साथ एक वाक्य खत्म नहीं। तुमसे कहा था)

+0

डांटिंग प्रीपोज़िशन कुछ ऐसा है जिसके साथ मैं नहीं डालूंगा। लटकती तैयारी के खिलाफ अनुमानित सख्ती से शैली पर एक अवलोकन से स्पष्ट रूप से विकसित हुआ। बुद्धिमानी के लिए, वाक्य के पहले और आखिरी शब्द वे हैं जिनके पास सबसे प्राकृतिक प्रभाव है। इस प्रकार इसे रणनीतिक रूप से कमजोर माना जाता है ताकि केवल एक रणनीतिक रूप से महत्वपूर्ण स्थान पर रखा जा सके। –

+0

@ जिम: स्टाइल सभी अच्छी और अच्छी है, लेकिन कुछ लोगों को यह मूर्खतापूर्ण धारणा है कि यह अनजान है, इस सवाल के शीर्षक के रूप में इस तरह की मूर्खता का कारण बनता है। –

+0

इस प्रश्न का शीर्षक पर्याप्त स्पष्ट लगता है हालांकि मैंने "क्या" के बजाय * * का उपयोग करने का सुझाव दिया होगा। एक और सटीक phrasing हो सकता है: "sys.argv प्रसंस्करण के लिए कौन सी एन्कोडिंग का उपयोग किया जाता है?" टेक्स्ट एन्कोडिंग का पूरा मुद्दा सरल सरल ASCII स्ट्रिंग हैंडलिंग को संरक्षित करते हुए अंतर्राष्ट्रीय चरित्र सेट दोनों को समायोजित करने के इन सभी प्रयासों से जटिल हो गया है। पूरे मामले के आस-पास की शब्दावली समान रूप से घुल गई है। –

5

अगर यह मदद करता है या नहीं मैं नहीं जानता, लेकिन इस मैं क्या मिलता है

C:\Python27>python Lib\codingtest.py нер 
['Lib\\codingtest.py', '\xed\xe5\xf0'] 

C:\Python27>python Lib\codingtest.py hello 
['Lib\\codingtest.py', 'hello'] 

बेकार में: डॉस मोड में

>>> print "hello" 
hello 
>>> "hello" 
'hello' 
>>> "привет" 
'\xef\xf0\xe8\xe2\xe5\xf2' 
>>> print "привет" 
привет 
>>> sys.getdefaultencoding() 
'ascii' 
>>> 

क्या हम इस से अनुमान लगा सकते हैं? मुझे अभी तक पता नहीं है ... मैं थोड़ा सा टिप्पणी करूंगा।

थोड़ा सा बाद में: sys.argvsys.stdin.encoding साथ इनकोडिंग और नहीं sys.getdefaultencoding()

+0

\ xef यूनिकोड सीपी 1251 लघु लिटर पीई ('पी') का सिरिलिक प्रतिनिधित्व है, इस प्रकार मुझे विश्वास करना शुरू हो रहा है कि 'sys.argv'' sys.stin.encoding' के साथ एन्कोड किया गया है और 'sys.getdefaultencoding() नहीं ' – soulseekah

4

कुछ टिप्पणियों:

(1) यह निश्चित रूप से sys.getdefaultencoding नहीं है।

(2) sys.stdin.encoding एक बेहतर शर्त प्रतीत होता है।

(3) विंडोज़ पर, sys.stdin.encoding का वास्तविक मूल्य स्टेडियो प्रदान करने वाले सॉफ्टवेयर के आधार पर भिन्न होगा। आईडीएलई सिस्टम "एएनएसआई" कोड पेज का उपयोग करेगा, उदाहरण के लिए अधिकांश पश्चिमी यूरोप और अमेरिका और पूर्व उपनिवेशों में cp1252। हालांकि कमांड प्रॉम्प्ट विंडो में, जो एमएस-डॉस को कम या ज्यादा अनुकरण करता है, संबंधित पुराने डॉस कोड पेज (उदा। सीपी 850) डिफ़ॉल्ट रूप से उपयोग किया जाएगा। इसे सीएचसीपी (चेंज कोड पेज) कमांड का उपयोग कर बदला जा सकता है।

(4) उपप्रोसेसर मॉड्यूल के लिए प्रलेखन तर्क और stdout के लिए उपयोग करने के लिए एन्कोडिंग पर कोई सुझाव नहीं प्रदान करता है।

(5) एक ट्रस्ट जो assert sys.stdin.encoding == sys.stdout.encoding कभी विफल नहीं होता है।

+0

अवलोकन सही साबित होते हैं, मैंने इसे भी देखा है। क्या आपको कोई जानकारी है कि sys.getdefaultencoding वास्तव में क्या देता है? –

+0

"यह यूनिकोड कार्यान्वयन द्वारा उपयोग किए जाने वाले वर्तमान डिफ़ॉल्ट स्ट्रिंग एन्कोडिंग का नाम देता है।" मुझे लगता है कि इसका मतलब है कि पायथन अपने कंसोल में डिफॉल्टएन्कोडिंग() का उपयोग करता है। आप जिस तरह से 'u'' तैयार करके डिफॉल्टेंकोडिंग() को ओवरराइड कर सकते हैं। महान उत्तर +1 – soulseekah

+4

मैं इस बारे में सहमत हूं (2) - मैंने बाद में इसके बारे में सोचा। (5) वास्तव में सत्य नहीं है: यूनिक्स के तहत, 'python test.py> test.txt' उदाहरण के लिए stdin एन्कोडिंग के लिए यूटीएफ -8 और stdout एन्कोडिंग के लिए कोई नहीं हो सकता है। – EOL

7

मुझे लगता है कि आप यह पूछ रहे हैं क्योंकि आप issue 2128 में भाग गए हैं। ध्यान दें कि यह पायथन 3.0 में तय किया गया है।

+0

धन्यवाद, मैं लिंक देखूँगा। मैं वास्तव में एक प्रोग्राम लिखने से पहले प्रश्न को रोकने के लिए पूछ रहा हूं जो कमांड लाइन से उपयोगकर्ता संदेश लेता है। – EOL

+0

पायथन 2.x के बारे में क्या? और विंडोज़? – EOL

0

sys.getfilesystemencoding() कम से कम विंडोज पर मेरे लिए काम करता है। विंडोज़ पर यह वास्तव में 'mbcs' है, और 'utf-8' * nix पर है।