2013-02-07 25 views
8

Ho un mucchio di stringhe di byte (str, non unicode, in python 2.7) contenenti dati unicode (nella codifica utf-8).python 2.7 string.join() con unicode

Sto cercando di unirsi a loro (da "".join(utf8_strings) o u"".join(utf8_strings)) che getta

UnicodeDecodeError: 'ascii' codec can't decode byte 0xec in position 0: ordinal not in range(128)` 

C'è un modo di fare uso di .join() metodo per le stringhe non-ASCII? sicuro di poterli concatenare in un ciclo for, ma non sarebbe economicamente conveniente.

risposta

14

Unire stringhe di byte utilizzando ''.join() funziona correttamente; l'errore che vedete sarebbe solo appare se si mescolato unicode e str oggetti:

>>> utf8 = [u'\u0123'.encode('utf8'), u'\u0234'.encode('utf8')] 
>>> ''.join(utf8) 
'\xc4\xa3\xc8\xb4' 
>>> u''.join(utf8) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 
>>> ''.join(utf8 + [u'unicode object']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 

Le eccezioni sono elevati quando si utilizza il valore Unicode u'' come il falegname, e l'aggiunta di una stringa Unicode per la lista di stringhe di unisciti, rispettivamente.

+0

come si rimuovono gli oggetti 'unicode' e' str'? – fiona

+1

@fiona decide le stringhe di byte in Unicode, quindi partecipa. È meglio decodificarlo il prima possibile, codificare solo quando hai finito il testo e devi passarlo a qualcosa che accetterà solo byte. –

2

"".join(...) funzionerà se ogni parametro è un str (qualunque sia la codifica).

Il problema che si sta verificando probabilmente non è correlato al join, ma ai dati forniti dall'utente. Pubblica più codice in modo che possiamo vedere cosa c'è di veramente sbagliato.

+1

grazie per il tuo aiuto. le 'utf8_strings' sono dati caricati da' xlrd'. 'xlrd', un magnifico modulo python, restituisce per fortuna tutti i dati (non numerici) in' unicode'. Mi diverto con loro, e sembra che io abbia fatto alcuni di loro 'str'. – thkang