我无法将我的字符串设置为以utf-8编码

时间:2013-07-15 17:48:11

标签: python unicode

我有一组将被收集的字符串,其中一些带有重音(例如é)。 我希望使用基本的ascii字母(对于URL)创建每个版本。 我找到了很多其他类似问题的例子,我可以这样做:

from unidecode import unidecode
unidecode(u"Café")

但是我有兴趣将它应用于一组字符串,取自csv / googledoc / similar。

在这种情况下,我假设的行动方式是声明他们使用类似的东西进行unicode:

from_google_doc = "Café"
a = unicode(fromgoogledoc,'utf-8')

然而,这会返回一个错误,即utf8无法解码位置3的字节0x82。

我试过了:

a = unicode("Café",'iso-8859-1')

有效,但是当传递给unidecode时,会切断é

道歉,如果这是基本的,我的研究/修补让我无处可去......我对Python很新,而且编码更新!

2 个答案:

答案 0 :(得分:1)

您需要弄清楚用于生成正在解析的输入文件的编解码器。

所有 8位数据(包括文件和网络流)必须使用某种形式的编码来将人类语言挤入所使用的计算机格式的限制中。您的数据也是编码的,不是UTF-8或ISO-8859-1(拉丁语1)。

您的UTF-8解码错误消息表明您在位置3处有一个十六进制字节82,因此我们假设您的示例看起来像这样:

from_google_doc = "Caf\x82"

Code page 437恰好位于十六进制82位置é,因此以上内容干净利落地解码为Unicode并具有预期结果:

>>> from_google_doc = 'Caf\x82'
>>> print from_google_doc.decode('cp437')
Café
>>> from unidecode import unidecode
>>> unidecode(from_google_doc.decode('cp437'))
'Cafe'

然而,如果没有关于源文档和相关元数据的更多详细信息,则无法确定这是否是要使用的正确编解码器。首先,您的帖子中的信息太少,无法说出哪些编解码器是正确的,code page 850 使用代码点82来表示é

编解码器无论如何都要根据具体情况确定,因为它取决于你如何获得源数据,以及如何检测使用的编解码器。

我恳请你阅读:

在继续之前,要完全理解编解码器的含义,以及它与Unicode的区别。

答案 1 :(得分:-1)

使用# -*- coding: ...标题(http://www.python.org/dev/peps/pep-0263/

定义源文件的编码

然后,实际使用该编码(在您的编辑器中)。在Python 2中,使用

from __future__ import unicode_literals

然后,

from_google_doc = "Café"

实际上已经是unicode类型。