2013-03-13 1 views
6

In Python 3, wie interpoliere ich eine Byte-Zeichenfolge in eine reguläre Zeichenfolge und das gleiche Verhalten wie Python 2 (d. H. Nur die Escape-Codes ohne das Präfix b oder doppelte Backslashes)?Python 3: Wie bekomme ich eine String-Literal-Darstellung einer Byte-Zeichenfolge?

z.B .:

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'" 

Beachten Sie, wie mit Python 3, erhalte ich den b Präfix in meiner Ausgabe und doppelten Unterstrichen. Das Ergebnis, das Ich mag würde bekommen, ist das Ergebnis, das ich in Python erhalten 2.

+0

In Ihrem Python 3 Beispiel Sie in eine Unicode-String werden interpoliert, kein Byte-String, wie Sie in Python tun 2. –

Antwort

4

In Python 2 Sie Typen haben str und unicode. str repräsentiert eine einfache Byte-Zeichenfolge, während unicode eine Unicode-Zeichenfolge ist.

Für Python 3 ist dies geändert: Jetzt str was 2 unicode in Python ist und byte ist, was str in Python 2.

So war, als Sie ("x = %s" % '\u041c\u0438\u0440').encode("utf-8") tun können Sie tatsächlich den u Präfix weglassen, wie es ist implizit. Alles, was nicht explizit in Python konvertiert wird, ist Unicode.

Dies wird Ihre letzte Zeile in Python 3 ergeben:

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

Nun, wie ich kodieren nach das Endergebnis, das, was Sie sollten immer: Nimm ein ankommendes Objekt, dekodieren zu Unicode (wie auch immer du das machst und dann, wenn du eine Ausgabe machst, kodiere sie in der Kodierung deiner Wahl. Versuchen Sie nicht, rohe Bytefolgen zu verarbeiten. Das ist nur hässliches und veraltetes Verhalten.

+0

Ja, die Codierung nach dem Ergebnis scheint ein besserer Weg zu sein. Vielen Dank! –

3

In Python 3 Beispiel werden Sie in ein Unicode-String Interpolation kein Byte-String, wie Sie in Python 2.

tun

In Python 3, bytes unterstützen keine Interpolation (String-Formatierung oder was haben Sie).

Entweder verketten oder Unicode verwenden alle durch und nur codieren, wenn Sie interpoliert haben:

b'x = ' + x 

oder

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

oder

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

Ja, die Kodierung nach dem Ergebnis scheint ein besserer Weg zu sein. Vielen Dank! –

0

In Python 2 sind Byte-Strings und reguläre Strings identisch, daher wird str() nicht konvertiert. In Python 3 ist eine Zeichenfolge immer eine Unicode-Zeichenfolge, daher führt str() einer Byte-Zeichenfolge eine Konvertierung durch.

Sie können Ihre eigene Umwandlung stattdessen tun, das tut, was Sie wollen:

x2 = ''.join(chr(c) for c in x) 
Verwandte Themen