2010-06-03 5 views
20

According to the docs, die eingebaute String-Codierung string_escape:Python "string_escape" vs "unicode_escape"

Produce [s] eine Zeichenfolge, die als Stringliteral in Python Quellcode

geeignet ist ... während die unicode_escape:

Produce [s] eine Zeichenfolge, die in Python Quellcode geeignet als Unicode Literal ist

Also sollten sie ungefähr das gleiche Verhalten haben. ABER, erscheinen sie Apostrophe anders zu behandeln:

>>> print """before '" \0 after""".encode('string-escape') 
before \'" \x00 after 
>>> print """before '" \0 after""".encode('unicode-escape') 
before '" \x00 after 

Die string_escape entkommt dem Apostroph, während die eine Unicode nicht. Ist es sicher anzunehmen, dass ich einfach kann:

>>> escaped = my_string.encode('unicode-escape').replace("'", "\\'") 

... und das erwartete Verhalten erhalten?

Bearbeiten: Nur um super klar zu sein, ist das erwartete Verhalten etwas als literal geeignet.

Antwort

19

Nach meiner Interpretation der Implementierung von unicode-escape und der Unicode repr in der Quelle CPython 2.6.5, ja; Der einzige Unterschied zwischen repr(unicode_string) und unicode_string.encode('unicode-escape') ist die Einbeziehung von Zeilenumbruch und das Entweichen des jeweils verwendeten Zitats.

Sie werden beide von der gleichen Funktion, unicodeescape_string angetrieben. Diese Funktion verwendet einen Parameter, dessen einzige Funktion darin besteht, die Hinzufügung der Zeilenumbruch-Anführungszeichen und die Escape-Funktion dieses Zitats umzuschalten.

+0

Dies war die klarste Antwort auf einen Unicode-Fehler "nicht unterstützte Unicode-Escape-Sequenz" Es funktioniert sogar in 2016! Vielen Dank! – dotslash

10

Im Bereich 0 ≤ c < 128, ja der ' ist der einzige Unterschied für CPython 2.6.

>>> set(unichr(c).encode('unicode_escape') for c in range(128)) - set(chr(c).encode('string_escape') for c in range(128)) 
set(["'"]) 

Außerhalb dieses Bereichs sind die beiden Typen nicht austauschbar.

>>> '\x80'.encode('string_escape') 
'\\x80' 
>>> '\x80'.encode('unicode_escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can’t decode byte 0x80 in position 0: ordinal not in range(128) 

>>> u'1'.encode('unicode_escape') 
'1' 
>>> u'1'.encode('string_escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: escape_encode() argument 1 must be str, not unicode 

Auf Python 3.x, die string_escape Codierung nicht mehr existiert, da str nur Unicode speichern kann.

+1

Das liegt daran, dass '\ x80' keine gültige ascii-codierte Zeichenfolge ist. Versuch 'u' x80'.encode ('unicode-escape') 'und du bekommst' \\ x80'' –

+0

@Mike: Aber ist dein 'my_string' ein' str' oder ein 'unicode'? – kennytm