Python文本编码

0 投票
4 回答
3991 浏览
提问于 2025-04-16 08:36

我有一个文件里面有这段文字 - Recuérdame(注意这是个法语单词)。当我用一个Python脚本读取这个文件时,得到的文字是Recuérdame

我把它当作Unicode字符串来读取。我需要找出这个文本的编码是什么,然后解码吗?还是说我的终端在搞鬼?

4 个回答

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,现在应该可以处理所有的实体了。

1

这不是一个Unicode字符串。它是用某种编码方式编码的字符串。所以它可能是UTF-8、Latin-1或者其他什么编码。在这个例子中,&#xE9是一个HTML/XML实体,表示的是字母é。这个编码方式在HTML和XML中用来表示非ASCII字符。

如果想把它解码成Unicode,可以看看Fredrik Lundh的方法:http://effbot.org/zone/re-sub.htm#unescape-html

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提供的链接)。

撰写回答