EDIT: (principali cambiamenti tra questa modifica e quello precedente .... Nota: sto usando Python 2.6.4 su una casella di Ubuntu)
In primo luogo, il mio primo tentativo di risposta , Ho fornito alcune informazioni generali su print
e str
che lascerò qui sotto per il beneficio di chiunque abbia problemi più semplici con print
e il passaggio a questa domanda. Per quanto riguarda un nuovo tentativo di affrontare il problema sperimentato dall'OP ... Fondamentalmente, sono propenso a dire che non c'è un proiettile d'argento qui e se lo print
riesce in qualche modo a dare un senso a una strana stringa letterale, allora questo non è un comportamento riproducibile . Sono portato a questa conclusione dal seguente interazione divertente con Python nella mia finestra del terminale:
>>> print '\xaa\xbb\xcc'
��
Hai provato a ingresso ª »Ì direttamente dal terminale? A un terminale Linux utilizzando utf-8 come codifica, questo è effettivamente letti come sei byte, che possono poi essere fatte per assomigliare tre caratteri unicode con l'aiuto del metodo decode
:
>>> 'ª»Ì'
'\xc2\xaa\xc2\xbb\xc3\x8c'
>>> 'ª»Ì'.decode(sys.stdin.encoding)
u'\xaa\xbb\xcc'
Quindi, la Il letterale '\xaa\xbb\xcc'
ha senso solo se lo decodifichi come un letterale latin-1 (beh, in realtà potresti usare una codifica diversa che concorda con latin-1 sui caratteri rilevanti). Per quanto riguarda lo print
'funziona solo' nel tuo caso, certamente non fa per me - come menzionato sopra.
Ciò si spiega con il fatto che quando si utilizza una stringa letterale non con prefisso u
- cioè "asdf"
anziché u"asdf"
- la stringa risultante utilizzerà parte codifica non unicode. No; di fatto, lo stesso oggetto stringa sarà encoding-inconsapevole, e dovrete trattarlo come se fosse codificato con encoding x, per il valore corretto di x. Questa idea di base mi porta alla seguente:
a = '\xAA\xBB\xCC'
a.decode('latin1')
# result: u'\xAA\xBB\xCC'
print(a.decode('latin1'))
# output: ª»Ì
Nota l'assenza di errori di decodifica e l'uscita corretta (che mi aspetto di essere rimanere adeguata in qualsiasi altro contenitore). Apparentemente la tua stringa letterale può essere interpretata da Python, ma non senza un aiuto.
Questo aiuto? (Almeno a capire come funzionano le cose, se non a rendere la gestione delle codifiche più facile ...)
Ora, per alcuni bit divertenti con qualche valore esplicativo (si spera)! Questo funziona bene per me:
sys.stdout.write("\xAA\xBB\xCC".decode('latin1').encode(sys.stdout.encoding))
saltare sia la decodifica o la codifica risultati in parte un'eccezione unicode-related. In teoria, questo ha senso, poiché la prima decodifica è necessaria per decidere quali caratteri ci sono nella stringa data (l'unica cosa ovvia a prima vista è ciò che ci sono byte - l'idea di Python 3 di avere (unicode) stringhe per caratteri e byte per, beh, byte, sembra all'improvviso superbamente ragionevole), mentre la codifica è necessaria in modo che l'output rispetti la codifica del flusso di output. Ora questo
sys.stdout.write("ąöî\n".decode(sys.stdin.encoding).encode(sys.stdout.encoding))
funziona come ci si aspetta, ma i personaggi sono in realtà proveniente dalla tastiera e quindi sono effettivamente codificati con la codifica stdin ... Inoltre,
ord('ą'.decode('utf-8').encode('latin2'))
restituisce il corretto 177 (il mio input encoding is utf-8), ma '\ xc4 \ x85'.encode (' latin2 ') non ha senso per Python, in quanto non ha idea di come dare un senso a' \ xc4 \ x85 'e capisce il codice 'ascii' è il meglio che può fare.
La risposta originale:
The relevant bit della documentazione Python (per la versione 2.6.4) dice che print(obj)
si intende per stampare la stringa data dal str(obj)
. Suppongo che potresti quindi effettuare il wrapping in una chiamata a unicode
(come in unicode(str(obj))
) per ottenere una stringa unicode - oppure potresti semplicemente usare Python 3 e scambiare questo particolare fastidio per un paio di tipi diversi. ;-)
Per inciso, questo dimostra che è possibile manipolare il risultato di print
ing un oggetto, proprio come è possibile manipolare il risultato della chiamata str
su un oggetto, cioè per fare scherzi con il metodo __str__
. Esempio:
class Foo(object):
def __str__(self):
return "I'm a Foo!"
print Foo()
Per quanto riguarda l'effettiva attuazione di print
, mi aspetto che questo non sarà utile a tutti, ma se davvero volete sapere cosa sta succedendo ... E 'nel file Python/bltinmodule.c
nella Sorgenti Python (sto guardando alla versione 2.6.4). Cerca una linea che inizi con builtin_print
. In realtà è tutto molto semplice, nessuna magia sta succedendo lì.:-)
Speriamo che questo risponda alla tua domanda ... Ma se hai un problema più arcano che mi manca completamente, commenta, farò un secondo tentativo. Inoltre, presumo che abbiamo a che fare con Python 2.x; altrimenti suppongo che non avrei un commento utile.
Potrebbe farci un esempio di ciò che si è tentato, quello che si voleva/aspetta di ottenere, e che cosa avete ottenuto? Ci aiuterebbe a meglio –
La domanda è relativa a Python 2 o 3? –
Poiché parla di "funzione di stampa", probabilmente è Python 3. –