2013-02-07 17 views
8

Mam kilka ciągów bajtów (str, a nie unicode, w python 2.7) zawierających dane Unicode (w kodowanie utf-8).python 2.7 string.join() z Unicode

Próbuję połączyć je (przez "".join(utf8_strings) lub u"".join(utf8_strings)), który rzuca

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

Czy istnieje jakiś sposób, aby skorzystać z .join() metoda ciągów non-ASCII? jestem pewien, że mogę je połączyć w pętlę for, ale nie byłoby to opłacalne.

Odpowiedz

14

Łączenie ciągów bajtów za pomocą ''.join() działa dobrze; błąd widać byłoby tylko pojawi się, jeśli miesza unicode i str obiekty:

>>> 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) 

Wyjątki powyżej są podnoszone przy użyciu wartości Unicode u'' jako stolarz i dodając ciąg Unicode do listy ciągów dołączyć, odpowiednio.

+0

w jaki sposób można wtedy odłączyć obiekty 'unicode' i' str'? – fiona

+1

@fiona zadecyduj o swoich ciągach bajtów do Unicode, a następnie dołącz. Najlepiej jest dekodować jak najwcześniej, kodować tylko wtedy, gdy skończysz z tekstem i musisz przekazać go do czegoś, co tylko zaakceptuje bajty. –

2

"".join(...) będzie działać, jeśli każdy parametr jest str (bez względu na kodowanie).

Problem, który widzisz, prawdopodobnie nie jest związany z łączeniem, ale dane, które do niego doprowadzasz. Napisz więcej kodu, abyśmy mogli zobaczyć, co naprawdę jest nie tak.

+1

dziękuję za pomoc. "utf8_strings" to dane wczytane przez 'xlrd'. 'xlrd', wspaniały moduł python, na szczęście zwraca wszystkie (nieliczbowe) dane w' unicode'. Bawię się z nimi i wydaje mi się, że zrobiłem niektóre z nich "str". – thkang