我的文件是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的一个超集。
我们团队的版本控制和文本编辑器不关心的编码。 那么,如何处理它的代码?
您正在试图打开文件没有指定编码,这意味着Python使用默认值(ASCII)。
您需要字节串明确解码,使用.decode()
函数:
template_str = template_str.decode('utf8')
你val
变量,你试过插值到您的模板本身就是一个Unicode值和Python要自动将您的字节串的模板(从文件中读取)转换成Unicode值了,所以它可以结合两者,它会使用默认的编码这样做。
我提到已经你应该阅读乔尔斯波斯基的Unicode的文章和Python的Unicode指南 ? 他们会帮助你了解这里发生了什么。
溶液中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
我想,你肯定你的文件在ASCII编码。 你是? :)至于ASCII包含在UTF-8,您可以使用UTF-8,不期待问题解码此数据。 然而,当你确信该数据仅仅是ASCII,你应该使用解码ASCII只是,而不是UTF-8的数据。
“我如何得到它加载为UTF8?”
我相信你的意思是“我如何得到它加载为Unicode?”。 只是用ASCII编码解码器解码的数据,在Python 2.x中,所产生的数据将是类型的unicode
。 在Python 3,所得到的数据将是类型的str
。
你将不得不为了学习如何在Python执行这种解码的阅读关于这个话题。 一旦了解,这是非常简单的。