Domanda

Questo è in python 2.4. Qui è la mia situazione. Tiro di una stringa da un database, e contiene un umlaut 'o' (\ XF6). A questo punto se corro tipo (valore) restituisce str. Poi tenta di eseguire .decode ( 'utf8'), e ottengo un errore ( 'utf8' codec non può decodificare byte in posizione 1-4).

In realtà il mio obiettivo qui è solo quello di fare con successo il tipo (valore) unicode di ritorno. Ho trovato un precedente domanda che avevano qualche informazione utile, ma l'esempio dalla risposta raccolte non sembra funzionare per me. C'è qualcosa che sto facendo male qui?

Ecco il codice per riprodurre:

Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

Non ho mai realmente ottenere la dichiarazione di scrittura, perché non riesce nella prima istruzione.

Grazie per il vostro aiuto.

Modifica

ho verificato che charset del DB è utf8. Quindi, nel mio codice per riprodurre ho cambiato '\ XF6' a '\ xc3 \ xB6', e il fallimento si verifica ancora. C'è una differenza tra 'utf8' e 'utf8'?

La punta sull'utilizzo di codec per scrivere in un file è a portata di mano (io sicuramente lo uso), ma in questo scenario Sto scrivendo un file di log per il debug.

È stato utile?

Soluzione

  

Quindi, nel mio codice per riprodurre ho cambiato '\ XF6' a '\ xc3 \ xB6', e l'errore si verifica ancora

Non è in prima linea lo fa non:

>>> 'w\xc3\xb6rner'.decode('utf-8')
u'w\xf6rner'

La seconda linea sarà errore fuori però:

>>> file.write('Name: %s - %s\n' %(Name, type(Name)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)

che è interamente quello che ci si aspetta, cercando di scrivere i caratteri non-ASCII Unicode ad un flusso di byte. Se si utilizza il suggerimento di Jiri di un flusso codec avvolto è possibile scrivere direttamente Unicode, altrimenti si dovrà ri-codificare la stringa Unicode in byte manualmente.

Una migliore, a fini di registrazione, sarebbe semplicemente quello di sputare fuori un repr () della variabile. Allora non dovete preoccuparvi di caratteri Unicode che sono in là, o ritorni a capo o altri caratteri indesiderati:

name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'

Altri suggerimenti

La stringa non è nella codifica UTF-8. Se si vuole 'decodificare' stringa unicode, la stringa deve essere in codifica specificato dal parametro. Ho provato questo e funziona perfettamente:

print 'w\xf6rner'.decode('cp1250')

Modifica

Per la scrittura stringhe Unicode per il file è possibile utilizzare il modulo codecs:

import codecs
f = codecs.open("yourfile.txt", "w", "utf8")
f.write( ... )

E 'utile per specificare la codifica degli input / output e utilizzando stringa 'unicode' in tutto il codice senza preoccuparsi delle differenti codifiche.

E 'ovviamente codifica 1 byte. 'O' in UTF-8 è '\ xc3 \ xB6'.

La codifica potrebbe essere:

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • Win-1250
  • Win-1252

È necessario utilizzare "ISO-8859-1":

Name = 'w\xf6rner'.decode('iso-8859-1')
file.write('Name: %s - %s\n' %(Name, type(Name)))

utf-8 utilizza 2 byte per sfuggire nulla al di fuori ASCII, ma qui è solo 1 byte, in modo da iso-8859-1 è probabilmente corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top