0

我在一个文件中有这个文本 - Recuérdame(注意它是一个法语单词)。当我用 python 脚本读取这个文件时,我得到这个文本为Recuérdame.

我把它读成一个 unicode 字符串。我是否需要找到文本的编码并对其进行解码?还是我的终端在捉弄我?

4

4 回答 4

5

是的,您需要知道文本文件的编码才能转换为 unicode 字符串(来自构成文件的字节)。

例如,如果您知道编码是 UTF-8:

with open('foo.txt', 'rb') as f:
    contents = f.read().decode('utf-8-sig')   # -sig takes care of BOM if present

但是,您文件中的文本似乎不是 Unicode 编码的;重音字符显然存储为 XML 实体,必须手动转换(帽子提示为 jleedev 链接)。

于 2010-12-16T06:38:23.323 回答
1

不是Unicode 字符串。它是任何编码的字符串。因此它是 UTF-8 或 Latin-1 或其他字符串。在这种情况下,&#xE9是一个表示 é 的 HTML/XML 实体。它是 HTML 和 XML 中用于对非 ascii 数据进行编码的编码。

要将其解码为 Unicode,请查看 Fredrik Lundhs 方法:http ://effbot.org/zone/re-sub.htm#unescape-html

于 2010-12-16T06:46:35.093 回答
0

它是 HTML,这种结构称为“实体”。您可以使用

def entity_decode(match):
    _, is_hex, entity = match.groups()
    base = 16 if is_hex else 10
    return unichr(int(entity, base))

print re.sub("(?i)(&#(x?)([^;]+);)", 
       entity_decode,
       "Recurdame")

解码所有实体。

编辑:是的,它们当然不是 latin1,现在它应该适用于所有实体

于 2010-12-16T06:46:07.647 回答
0

使用 xlrd,我在一行 ...xl_data.find(str(cell_value))... 中给出了错误:“'ascii' codec can't encode character u'\xdf' in position 3: ordinal not在范围内(128)”。论坛中的所有建议对我的德语单词都没有用。但改为: ...xl_data.find(cell.value)... 没有错误。所以,我想在 xldr 的某些命令中使用字符串作为参数有特定的编码问题。

于 2012-12-23T15:32:08.513 回答