29 Stimmen

Python "string_escape" vs. "unicode_escape"

Laut den Unterlagen die eingebaute String-Kodierung string_escape :

Erzeugt eine Zeichenkette, die als String-Literal in Python-Quellcode geeignet ist

...während die unicode_escape :

Erzeugt eine Zeichenkette, die als Unicode-Literal in Python-Quellcode geeignet ist

Sie sollten also in etwa das gleiche Verhalten aufweisen. ABER, sie scheinen einfache Anführungszeichen unterschiedlich zu behandeln:

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

Les string_escape das einfache Anführungszeichen umbricht, während dies bei der Unicode-Version nicht der Fall ist. Ist es sicher anzunehmen, dass ich einfach kann:

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

...und erhalten das erwartete Verhalten?

Edita: Nur um ganz klar zu sein, ist das erwartete Verhalten etwas geeignetes als wörtlich zu erhalten.

26voto

Mike Boers Punkte 6555

Nach meiner Interpretation der Umsetzung von unicode-escape und der Unicode repr in den CPython 2.6.5-Quellen, ja; der einzige Unterschied zwischen repr(unicode_string) y unicode_string.encode('unicode-escape') ist die Einbeziehung von umschließenden Anführungszeichen und das Escaping des verwendeten Anführungszeichens.

Sie werden beide von derselben Funktion angetrieben, unicodeescape_string . Diese Funktion nimmt einen Parameter entgegen, dessen einzige Funktion darin besteht, das Hinzufügen der umschließenden Anführungszeichen und das Escapen dieser Anführungszeichen zu aktivieren.

15voto

kennytm Punkte 488916

Innerhalb des Bereichs 0 c < 128, ja die ' ist der einzige Unterschied zu 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

Unter Python 3.x wird die string_escape Kodierung nicht mehr existiert, da str kann nur Unicode speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X