Python "string_escape" против "unicode_escape" - PullRequest
24 голосов
/ 03 июня 2010

Согласно документации , встроенная строковая кодировка 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("'", "\\'")

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

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

Ответы [ 2 ]

22 голосов
/ 09 июня 2010

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

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

12 голосов
/ 03 июня 2010

В диапазоне 0 ≤ c <128, да, <code>' - единственное отличие для 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.

...