2010-06-03 7 views
20

According to the docs, la stringa incorporato codifica string_escape:Python "string_escape" vs "unicode_escape"

Produce [s] una stringa che è adatto come stringa di Python codice sorgente

... mentre la unicode_escape:

Produce [s] una stringa che è adatto come Unicode letterale nel codice sorgente Python

Quindi, dovrebbero avere più o meno lo stesso comportamento. MA, sembrano trattare apici in modo diverso:

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

Il string_escape sfugge l'apice singolo mentre quello Unicode non lo fa. È sicuro assumere che posso semplicemente:

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

... e ottenere il comportamento previsto?

Modifica: Solo per essere super chiari, il comportamento previsto sta diventando qualcosa di adatto come letterale.

risposta

19

Secondo la mia interpretazione dell'implementazione di unicode-escape e l'unicode repr nell'origine CPython 2.6.5, sì; l'unica differenza tra repr(unicode_string) e unicode_string.encode('unicode-escape') è l'inclusione delle virgolette e l'escaping di qualsiasi citazione usata.

Entrambi sono gestiti dalla stessa funzione, unicodeescape_string. Questa funzione accetta un parametro la cui unica funzione è quella di alternare l'aggiunta delle virgolette e l'escaping di quella citazione.

+0

Questa è stata la risposta più chiara a qualche errore unicode 'sequenza di escape Unicode non supportata. Funziona anche nel 2016! Grazie! – dotslash

10

All'interno dell'intervallo 0 ≤ c < 128, sì l'' è l'unica differenza per 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(["'"]) 

Al di fuori di questo intervallo i due tipi non sono scambiabili.

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

In Python 3.x, la codifica string_escape non esiste più, poiché str può memorizzare solo Unicode.

+1

Ciò è dovuto al fatto che '\ x80' non è una stringa codificata ascii valida. Prova 'u '\ x80'.encode (' unicode-escape ')' e ottieni '' \\ x80'' –

+0

@Mike: Ma il tuo' my_string' a 'str' o 'unicode'? – kennytm