2010-06-24 14 views

risposta

4

Basta utilizzare una stringa di formato unicode, piuttosto che avere una stringa di byte in quel ruolo:

>>> class X(object): 
... def __str__(self): return 'str' 
... def __unicode__(self): return u'unicode' 
... 
>>> x = X() 
>>> print u'%s' % x 
unicode 
+0

Avere '__unicode__' restituire un bytestring e la stampa di un oggetto Unicode fanno esempi terribili. –

+0

@Mike, d'accordo sul problema "return" - corretto quell'errore di battitura. Forte disaccordo sul 'print': su una piattaforma decente,' sys.stdout.encoding' è impostato e la stampa funzionerà perfettamente - mentre stai indovinando ciecamente il 'some_encoding' da usare (se non è su sys. come puoi indovinarlo, prega?). –

+1

su quale "piattaforma decente" fa 'python -c 'print u" \ xff "'> some_file' non genera un UnicodeEncodeError? – habnabit

1

No. Non avrebbe senso per questo di essere il caso.

print (u"%s" % obj).encode(some_encoding) utilizzerà obj.__unicode__.

+1

Odia l'idea di indovinare ciecamente al 'some_encoding' come questa risposta costringerebbe uno a fare - una piattaforma decente imposterà' sys.stdout.encoding' in modo che una semplice 'stampa' funzionerà perfettamente, se non lo fai tu deve avvolgere sys.stdout in un wrapper che imposta la codifica, in ** un ** luogo (quindi puoi usare 'print' come è giusto e decente!), piuttosto che spargere tali supposizioni su tutto il mobilio (che a * * orribile ** modo di programmare). –

0

In primo luogo, ce n'è uno?

Sicuro (sorta di). Una stringa di formato Unicode convertirà i valori del formato in Unicode, implicando che verrà chiamato obj.__unicode__ (reference).

u'this is a %s' % ('unicode string') 

A parte quanto sopra, non c'è alcun motivo particolare per cui non si poteva essere esplicito:

print '%s' % (unicode(obj)) 
+0

'print '% s'% unicode (obj)' non è veramente esplicito. Converte implicitamente uno str in un unicode quando si applica%, che è tra le cose più brutte di Python. –

+0

Ci siamo imbattuti in questo pochi secondi dopo. Immagino che questo funzioni per me! – mpen

+1

... e si basa su 'print'ing una stringa unicode esattamente come il mio tanto vituperato, tanto downvoted, e molto prima-risposta - vedere questo upvoted invece potrebbe confermare il sospetto che le downvoters sono infatti intenti su un personal vendetta, non un'obiezione tecnica, qualunque parola di bocca spalancata possa tentare di mascherarla ;-). –

Problemi correlati