Подтвердить что ты не робот

Python "string_escape" против "unicode_escape"

В соответствии с документами встроенная строковая кодировка string_escape:

Произведите [s] строку, которая подходит как строковый литерал в исходном коде Python

... в то время как unicode_escape:

Произведите [s] строку, подходящую как литерал Юникода в исходном коде Python

Таким образом, они должны иметь примерно одинаковое поведение. НО, по-видимому, они обрабатывают одинарные кавычки по-разному:

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

string_escape избегает одиночной кавычки, а Unicode - нет. Можно ли предположить, что я могу просто:

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

... и получить ожидаемое поведение?

Изменить: Просто, чтобы быть предельно ясным, ожидаемое поведение получает что-то подходящее как литерал.

4b9b3361

Ответ 1

Согласно моей интерпретации реализации unicode-escape и unicode repr в источнике CPython 2.6.5, да; единственная разница между repr(unicode_string) и unicode_string.encode('unicode-escape') заключается в включении кавычек в кавычки и выходе из используемой цитаты.

Оба они управляются одной и той же функцией unicodeescape_string. Эта функция принимает параметр, единственная функция которого заключается в том, чтобы переключать добавление кавычек и экранирование этой цитаты.

Ответ 2

В пределах диапазона 0 ≤ c < 128, да ' - единственное отличие для 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(["'"])

Вне этого диапазона два типа не подлежат обмену.

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

В Python 3.x кодировка string_escape больше не существует, поскольку str может хранить только Юникод.