Согласно документам, встроенному строковому кодированию 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("'", "\\'")
... и получите ожидаемое поведение?
Править: Только, чтобы быть супер ясным, ожидаемое поведение получает что-то подходящее как литерал.
Согласно моей интерпретации реализации unicode-escape
и unicode repr
в исходном коде CPython 2.6.5, да; единственное различие между repr (unicode_string)
и unicode_string.encode ('unicode-escape')
заключается во включении заключительных кавычек и экранировании использованных кавычек.
Они оба управляются одной и той же функцией, unicodeescape_string
. Эта функция принимает параметр, единственная функция которого - переключать добавление заключительных кавычек и экранирование этой цитаты.
В диапазоне 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.