2013-02-07 78 views
8

我有一堆字节字符串(str,而不是unicode,在Python 2.7中)包含Unicode数据(在utf-8编码)。python 2.7 string.join()与unicode

我试图(通过"".join(utf8_strings)u"".join(utf8_strings))加入他们会抛出

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

有没有什么办法让非ASCII字符串使用.join()方法吗?当然,我可以在for循环中连接它们,但这不会符合成本效益。

回答

14

使用''.join()加入字节字符串就行了;你看到错误会只有出现,如果你混合unicodestr对象:当使用Unicode值u''的木匠,并添加一个Unicode字符串字符串到列表上方

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

的异常升高加入,分别。

+0

那么如何解开unicode和str对象呢? – fiona

+1

@fiona将您的字节字符串决定为Unicode,然后加入。最好尽早解码,只在完成文本时进行编码,并且必须将其传递给只接受字节的内容。 –

2

"".join(...)将工作,如果每个参数是str(无论编码可能是什么)。

您看到的问题可能与联接无关,而是您提供给它的数据。发布更多的代码,以便我们可以看到真正的错误。

+1

感谢您的帮助。 'utf8_strings'是由'xlrd'加载的数据。 'xlrd',一个宏伟的python模块,谢天谢地返回'unicode'中的所有(非数字)数据。我捣鼓他们,而且我似乎让他们中的一些人变成了'str'。 – thkang