Python "string_escape" vs "unicode_escape"


Answers

Dans la plage 0 ≤ c <128, oui la ' est la seule différence pour 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(["'"])

En dehors de cette plage, les deux types ne sont pas échangeables.

>>> '\x80'.encode('string_escape')
'\\x80'
>>> '\x80'.encode('unicode_escape')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec cant 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

Sur Python 3.x, le codage string_escape n'existe plus, car str ne peut stocker que Unicode.

Question

Selon les docs , l'encodage de chaîne string_escape :

Produire [s] une chaîne qui convient comme chaîne littérale dans le code source Python

... tandis que l' unicode_escape :

Produire [s] une chaîne qui convient comme littéral Unicode dans le code source Python

Donc, ils devraient avoir à peu près le même comportement. MAIS, ils semblent traiter les guillemets simples différemment:

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

string_escape échappe à la citation unique alors que la citation Unicode ne l'est pas. Est-il sûr de supposer que je peux simplement:

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

... et obtenir le comportement attendu?

Edit: Juste pour être super clair, le comportement attendu est d'obtenir quelque chose de convenable comme un littéral.




Links