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)
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? –
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? –
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