2012-10-29 15 views
6

Sto utilizzando il modulo OptParse per recuperare un valore di stringa. OptParse only supports str typed strings, non unicode uni.Come recuperare le stringhe con caratteri non ASCII con OptParse?

Quindi diciamo che mi metto il mio script con:

./someScript --some-option ééééé 

personaggi francesi, come 'e', ​​di essere digitato str, grilletto UnicodeDecodeError s quando viene letto il codice:

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

I giocato un po 'con la funzione built-in unicode, ma o ottengo un errore, o il carattere scompare:

>>> 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'' 

C'è qualcosa che posso fare per utilizzare OptParse per recuperare le stringhe unicode/utf-8?

UPDATE:

Sembra che la stringa può essere recuperato e stampato ok, ma poi cerco di utilizzare tale stringa con SQLite (utilizzando il modulo APSW), e cerca di convertire in unicode in qualche modo con cursor.execute("..."), quindi si verifica l'errore.

Ecco un esempio di programma che causa l'errore:

#!/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

Gli oggetti di tipo Str sono solo archivi di byte, quindi se l'input è UTF-8, la stringa manterrà il valore UTF-8. Dove viene generato l'errore Unicode? –

+0

Ho appena provato questo su una console UTF-8 e optparse funziona bene e restituisce il personaggio alla console. Puoi chiarire se questo errore è nel tuo codice o nel optparse? –

+0

Dipende dal tuo programma su optparse o stai costruendo da zero? In tal caso, consiglierei il pacchetto docopts anziché optparse. Sarai davvero davvero sorpreso di quanto sia semplice analizzare gli argomenti del cli. – Bruce

risposta

1

ingresso viene restituito nella codifica console, quindi, sulla base di esempio aggiornato, utilizzare:

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

unicode(opts.some_option) impostazioni di default usa ascii come la codifica.

0

Credo che l'errore è legato alla 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

Si potrebbe decodificare gli argomenti prima che le maniglie parser loro. Prendendo il tuo esempio:

#!/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 

Questo dà il seguente risultato:

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

Ho scelto la pagina di ISO/IEC 8859-15 codice, come sembra più adatto a voi. Adattarsi se necessario.

+0

Per evitare di codificare la codifica, è possibile provare a indovinare in questo modo: '' locale.getpreferredencoding() '' (importa '' locale''). – Stan

+0

A proposito, potrebbe essere necessario renderlo unicode con '' unicode (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

Questo non sembra funzionare per me. Stavi usando Python 2 o 3? Sto eseguendo Python 2.7. –

Problemi correlati