1

我有一组将被收集的字符串,其中一些带有重音符号(例如é)。我希望使用基本的 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 相当陌生,对编码也很陌生!

4

2 回答 2

1

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

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

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

from_google_doc = "Caf\x82"

代码页 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'

但是,如果没有有关源文档和相关元数据的更多详细信息,就无法判断这是否是要使用的正确编解码器。一方面,您的帖子中的信息太少,无法说明什么编解码器是正确的,代码页 850 使用代码点 82 来表示é

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

我敦促您阅读:

在继续之前,请充分了解编解码器的含义以及它与 Unicode 的不同之处。

于 2013-07-15T18:10:35.067 回答
-1

# -*- coding: ...使用标头 ( http://www.python.org/dev/peps/pep-0263/ )定义源文件的编码

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

from __future__ import unicode_literals

进而,

from_google_doc = "Café"

实际上已经是unicode类型。

于 2013-07-15T17:53:18.270 回答