Python “string_escape” по сравнению с “unicode_escape”

Согласно документам, встроенному строковому кодированию string_escape:

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

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

Произведите [s] строку, которая подходит как литерал Unicode в исходном коде 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("'", "\\'")

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

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

26
задан Mr_and_Mrs_D 26 January 2018 в 12:04
поделиться

2 ответа

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

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

24
ответ дан 28 November 2019 в 07:33
поделиться

В диапазоне 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 может хранить только Unicode.

13
ответ дан 28 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: