3

我的文件是 US-ASCII 和类似的命令a = file( 'main.html'),并将a.read()它们作为 ASCII 文本加载。如何让它加载为 UTF8?

我要解决的问题是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 38: ordinal not in range(128)

我正在使用文件的内容进行模板化,如template_str.format(attrib=val). 但是要插入的字符串是 ASCII 的超集。

我们团队的版本控制和文本编辑器并不关心编码。那么如何在代码中处理呢?

4

3 回答 3

6

在 Python2 中工作的解决方案:

import codecs
fo = codecs.open('filename.txt', 'r', 'ascii')
content = fo.read()  ## returns unicode
assert type(content) == unicode
fo.close()

utf8_content = content.encode('utf-8')
assert type(utf8_content) == str
于 2012-09-11T14:00:30.133 回答
6

您试图在不指定编码的情况下打开文件,这意味着 python 使用默认值(ASCII)。

您需要使用以下.decode()函数显式解码字节字符串:

 template_str = template_str.decode('utf8')

val尝试插入模板的变量本身就是一个 unicode 值,python 也希望自动将您的字节字符串模板(从文件中读取)转换为 unicode 值,以便它可以将两者结合起来,它会使用这样做的默认编码。

我是否已经提到您应该阅读 Joel Spolsky关于 UnicodePython Unicode HOWTO的文章?他们将帮助您了解这里发生的事情。

于 2012-09-11T14:09:10.803 回答
1

我想您确定您的文件是用 ASCII 编码的。你是?:) 由于 UTF-8 中包含 ASCII,因此您可以使用 UTF-8 解码此数据而不会出现问题。但是,当您确定数据只是 ASCII 时,您应该只使用 ASCII 而不是 UTF-8 来解码数据。

“如何让它以 UTF8 格式加载?”

我相信你的意思是“我如何让它加载为 unicode?”。只需使用 ASCII 编解码器对数据进行解码,在 Python 2.x 中,生成的数据将是unicode. 在 Python 3 中,结果数据的类型为str.

你必须阅读这个主题才能了解如何在 Python 中执行这种解码。一旦理解了,就很简单了。

于 2012-09-11T13:56:04.783 回答