Come posso trattare una stringa ASCII come unicode e annullare il escape dei caratteri di escape in esso in Python?

StackOverflow https://stackoverflow.com/questions/267436

  •  06-07-2019
  •  | 
  •  

Domanda

Ad esempio, se ho una stringa unicode , posso codificarla come una stringa ASCII in questo modo:

>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'

Tuttavia, ho ad es. questa ASCII stringa:

'\u003foo\u003e'

... che voglio trasformare nella stessa stringa ASCII del mio primo esempio sopra:

'<foo/>'
È stato utile?

Soluzione

Mi ci è voluto un po 'per capirlo, ma questa pagina ha avuto la risposta migliore:

>>> s = '\u003cfoo/\u003e'
>>> s.decode( 'unicode-escape' )
u'<foo/>'
>>> s.decode( 'unicode-escape' ).encode( 'ascii' )
'<foo/>'

Esiste anche un codec 'raw-unicode-escape' per gestire l'altro modo per specificare le stringhe Unicode - controlla " Unicode Constructors " sezione della pagina collegata per maggiori dettagli (dal momento che non sono Unicode-saavy).

EDIT: vedi anche Codifiche standard Python .

Altri suggerimenti

Ned Batchelder ha detto:

  

È un po 'pericoloso a seconda della provenienza della stringa,   ma che ne dici di:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'

In realtà questo metodo può essere reso sicuro in questo modo:

>>> s = '\u003cfoo\u003e'
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1]

Fai attenzione alla stringa a tre virgolette e al trattino subito prima delle 3 virgolette di chiusura.

  1. L'uso di una stringa tra 3 virgolette assicurerà che se l'utente immette '\\ " "(spazi aggiunti per maggiore chiarezza visiva) nella stringa non interromperebbe il valutatore;
  2. Il trattino alla fine è un fail-safe nel caso in cui la stringa dell'utente termini con un '\ " '. Prima di assegnare il risultato, suddividiamo il trattino inserito con [: -1]

Quindi non sarebbe necessario preoccuparsi di ciò che gli utenti inseriscono, purché sia ??acquisito in formato raw.

Su Python 2.5 la codifica corretta è "unicode_escape", non "unicode-escape" (notare il trattino basso).

Non sono sicuro che la versione più recente di Python abbia cambiato il nome unicode, ma qui ha funzionato solo con il carattere di sottolineatura.

Comunque, eccolo.

Ad un certo punto ti imbatterai in problemi quando incontri caratteri speciali come caratteri cinesi o emoticon in una stringa che vuoi decodificare, cioè errori che assomigliano a questo:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)

Nel mio caso (elaborazione dei dati di Twitter), ho decodificato come segue per consentirmi di vedere tutti i caratteri senza errori

>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>

È un po 'pericoloso a seconda della provenienza della stringa, ma che ne dici di:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top