2012-10-29 16 views
6

मैं स्ट्रिंग मान पुनर्प्राप्त करने के लिए OptParse मॉड्यूल का उपयोग कर रहा हूं। OptParse only supports str typed strings, unicode वाले नहीं।गैर-ASCII वर्णों के साथ स्ट्रिंग्स को ऑप्टपर्स के साथ कैसे पुनर्प्राप्त किया जा सकता है?

तो चलो कहते हैं कि मैं मेरी स्क्रिप्ट शुरू करते हैं साथ:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 99: ordinal not in range(128) 

मैं:

जैसे 'ई', आपके द्वारा लिखा गया जा रहा str, ट्रिगर UnicodeDecodeError रों जब कोड में पढ़ा
./someScript --some-option ééééé 

फ्रेंच वर्ण, यूनिकोड बिल्ट-इन फ़ंक्शन के साथ थोड़ा सा खेला जाता है, लेकिन या तो मुझे कोई त्रुटि मिलती है, या चरित्र गायब हो जाता है:

>>> unicode('é'); 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 
>>> unicode('é', errors='ignore'); 
u'' 

क्या का उपयोग करने के लिए मैं कुछ भी कर सकता हूं unicode/utf-8 तारों को पुनर्प्राप्त करने के लिए?

अद्यतन:

ऐसा लगता है कि स्ट्रिंग लिया गया और ठीक मुद्रित किया जा सकता है, लेकिन फिर मैं SQLite के साथ कि स्ट्रिंग (APSW मॉड्यूल का उपयोग करके) इस्तेमाल करने की कोशिश, और इसके साथ किसी भी तरह यूनिकोड में बदलने की कोशिश करता है cursor.execute("..."), और तब त्रुटि होती है।

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

import os, sys, optparse 
parser = optparse.OptionParser() 
parser.add_option("--some-option") 
(opts, args) = parser.parse_args() 
print unicode(opts.some_option) 
+0

स्ट्र ऑब्जेक्ट्स केवल बाइट स्टोर्स हैं इसलिए यदि इनपुट यूटीएफ -8 है, तो स्ट्रिंग यूटीएफ -8 मान रखेगी। यूनिकोड त्रुटि कहाँ फेंक दी जा रही है? –

+0

मैंने अभी यूटीएफ -8 कंसोल पर इसका परीक्षण किया है और ऑप्टपरसे ठीक काम करता है और चरित्र को कंसोल पर लौटाता है। क्या आप यह स्पष्ट कर सकते हैं कि यह त्रुटि आपके कोड में है या ऑप्टपर में है? –

+0

आपके प्रोग्राम को ऑप्टपर पर निर्भर करता है या आप स्क्रैच से बना रहे हैं? उस स्थिति में मैं optparse के बजाय docopts पैकेज की सिफारिश करेंगे। आप वाकई वास्तव में आश्चर्यचकित होंगे कि यह क्ली तर्कों को कितना आसान बनाता है। – Bruce

उत्तर

1

इनपुट, एन्कोडिंग कंसोल में दिया जाता है तो अपने अद्यतन उदाहरण के आधार पर, का उपयोग करें।

0

मेरा मानना ​​है कि अपने त्रुटि following से संबंधित है:

For example, to write Unicode literals including the Euro currency symbol, the ISO-8859-15 encoding can be used, with the Euro symbol having the ordinal value 164. This script will print the value 8364 (the Unicode codepoint corresponding to the Euro symbol) and then exit:

# -*- coding: iso-8859-15 -*- 

currency = u"€" 
print ord(currency) 
3

आप से पहले पार्सर हैंडल तर्क को डिकोड कर सकता

यहां एक नमूना प्रोग्राम है जो त्रुटि का कारण बनता है उन्हें। अपने उदाहरण ले रहा है:

#!/usr/bin/python 
# coding: utf-8 
import os, sys, optparse 
parser = optparse.OptionParser() 
parser.add_option("--some-option") 

# Decode the command line arguments to unicode 
for i, a in enumerate(sys.argv): 
    sys.argv[i] = a.decode('ISO-8859-15') 

(opts, args) = parser.parse_args() 
print type(opts.some_option), opts.some_option 

यह निम्न उत्पादन देता है:

C:\workspace>python file.py --some-option préférer 
<type 'unicode'> préférer 

मैं, ISO/IEC 8859-15 कोड पेज चुना गया है के रूप में यह आप के लिए सबसे उपयुक्त लगता है। यदि आवश्यक हो तो अनुकूल करें। एन्कोडिंग के रूप में उपयोग करने के लिए ascii

print opts.some_option.decode(sys.stdin.encoding) 

unicode(opts.some_option) चूक:

+0

एन्कोडिंग हार्डकोड से बचने के लिए आप इसे इस तरह अनुमान लगाने का प्रयास कर सकते हैं: '' locale.getpreferredencoding() '' (आयात '' लोकेल'')। – Stan

+0

वैसे, आपको इसे 'यूनिकोड (a.decode ("your_encoding_here") के साथ यूनिकोड बनाने की आवश्यकता हो सकती है) ''। – Stan

0
#!/usr/bin/python 
# coding: utf-8 

import os, sys, optparse 

reload(sys) 
sys.setdefaultencoding('utf-8') 

parser = optparse.OptionParser() 
parser.add_option(u"--some-option") 
(opts, args) = parser.parse_args() 
print opts.print_help() 
+0

यह मेरे लिए काम नहीं करता प्रतीत होता है। क्या आप अजगर 2 या 3 का उपयोग कर रहे थे? मैं अजगर 2.7 चला रहा हूँ। –

संबंधित मुद्दे