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("'", "\\'")
... и получить ожидаемое поведение?
Изменить: Просто, чтобы быть предельно ясным, ожидаемое поведение получает что-то подходящее как литерал.
Ответы
Ответ 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
может хранить только Юникод.