2013-03-13 23 views
6

In Python 3, come faccio a interpolare una stringa di byte in una stringa regolare e ottenere lo stesso comportamento di Python 2 (vale a dire: ottenere solo i codici di escape senza il prefisso b o il doppio backslash)?Python 3: Come si ottiene una rappresentazione letterale di stringa di una stringa di byte?

es .:

Python 2.7:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8') 
>>> str(x) 
'\xd0\x9c\xd0\xb8\xd1\x80' 
>>> 'x = %s' % x 
'x = \xd0\x9c\xd0\xb8\xd1\x80' 

Python 3.3:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8') 
>>> str(x) 
"b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'" 
>>> 'x = %s' % x 
"x = b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'" 

Si noti come con Python 3, ottengo il prefisso b nella mia uscita e doppia sottolineatura. Il risultato che vorrei ottenere è il risultato che ottengo in Python 2.

+0

Nel vostro Python 3 esempio, si sono interpolando in una stringa Unicode, non una stringa di byte, come si sta facendo in Python 2. –

risposta

4

In Python 2 hai tipi str e unicode. str rappresenta una stringa di byte semplice mentre unicode è una stringa Unicode.

Per Python 3, questo è cambiato: ora str è ciò che è stato unicode in Python 2 e byte è ciò che è stato str in Python 2.

Quindi, quando si fa ("x = %s" % '\u041c\u0438\u0440').encode("utf-8") si può effettivamente omettere il prefisso u, in quanto è implicito. Tutto ciò che non è esplicitamente convertito in python è unicode.

Questo produrrà la tua ultima riga in Python 3:

("x = %s" % '\u041c\u0438\u0440').encode("utf-8") 

Ora, come ho codificare dopo il risultato finale, che è quello che si dovrebbe sempre fare: prendere un oggetto in entrata, decodificarlo a unicode (come mai lo fai) e poi, quando fai un output, codificalo nella codifica della tua scelta. Non provare a gestire stringhe di byte non elaborate. Questo è solo un comportamento brutto e deprecato.

+0

Sì, la codifica dopo il risultato sembra un modo migliore per andare. Grazie! –

3

Nel vostro Python 3 esempio, si sta interpolando in una stringa Unicode, non una stringa di byte, come si sta facendo in Python 2.

In Python 3, bytes non supportano l'interpolazione (formattazione di stringhe o what-have-you).

Sia concatenare, o utilizzare Unicode per tutto e solo codificare quando si è interpolata:

b'x = ' + x 

o

'x = {}'.format(x.decode('utf8')).encode('utf8') 

o

x = '\u041c\u0438\u0440' # the u prefix is ignored in Python 3.3 
'x = {}'.format(x).encode('utf8') 
+0

Sì, la codifica dopo il risultato sembra un modo migliore per andare. Grazie! –

0

In Python 2, le stringhe di byte e le stringhe regolari sono le stesse, quindi non viene eseguita alcuna conversione da str(). In Python 3 una stringa è sempre una stringa Unicode, quindi str() di una stringa di byte esegue una conversione.

È possibile fare la propria conversione, invece, che fa quello che si vuole:

x2 = ''.join(chr(c) for c in x) 
Problemi correlati