2015-02-20 17 views
17

ho notato vale quanto segue:Una stringa UNICODE contenente solo caratteri ASCII sarà sempre uguale alla stringa ASCII?

>>> u'abc' == 'abc' 
True 
>>> 'abc' == u'abc' 
True 

Questo sarà sempre vero o potrebbe forse dipendere dal locale del sistema? (Sembra stringhe sono unicode in pitone 3: per esempio this question, ma byte in 2.x)

+0

I caratteri nel set ASCII sono indipendenti dalla codepage. Sono solo i caratteri estesi (da 0x80 a 0xff) che possono differire tra le impostazioni locali. – Phylogenesis

+5

@Phylogenesis: ci sono un sacco di codifiche che * non * usano ASCII come base. –

risposta

13

Python 2 esercita una coercizione tra unicode e str utilizzando il codec ASCII quando si confrontano i due tipi. Quindi sì, questo è sempre true.

Vale a dire, a meno che non si incasini l'installazione di Python e si usi sys.setdefaultencoding() per modificare quell'impostazione predefinita. Non è possibile farlo normalmente, perché la funzione è stata cancellata dal modulo al momento dell'avvio, ma c'è un Culto Cargo in giro dove la gente usa reload(sys) per ripristinare quella funzione e cambiare la codifica predefinita in qualcos'altro da provare risolvere i problemi impliciti di codifica e decodifica. Questa è una cosa stupida da fare proprio per questa ragione.

+1

Cosa c'è di sbagliato in 'sys.setdefaultencoding()'? –

+1

@techtonik: la modifica del sistema predefinito può rompere i pacchetti che si basano sul predefinito per essere ASCII, e cambiando solo * maschere * i problemi che il tuo codice ha affidandosi alla codifica e decodifica implicite. Se si imposta su Latin-1 tutte le decodifiche byte-unicode funzionano magicamente ma in realtà non hanno senso, se si imposta su UTF-8 tutte le codifiche Unicode-byte funzioneranno ma potrebbero non avere senso, ecc. efficacemente pre-spalking la gamba in caso di rottura, piuttosto che evitare di rompere la gamba in primo luogo. –

+0

Mi sembra un problema [workflow] (https://xkcd.com/1172/). C'è un esempio più reale/esplicito? –