我的文件是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的超集。
我们团队的版本控制和文本编辑器不关心编码。那么如何在代码中处理它呢?
答案 0 :(得分: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
答案 1 :(得分:6)
您试图在不指定编码的情况下打开文件,这意味着python使用默认值(ASCII)。
您需要使用.decode()
函数显式解码字节字符串:
template_str = template_str.decode('utf8')
你试图插入到模板中的val
变量本身就是一个unicode值,而python想要自动将你的字节串模板(从文件中读取)转换为unicode值,这样就可以了将两者结合起来,它将使用默认编码来执行此操作。
我是否已经提到你应该阅读Joel Spolsky的article on Unicode和Python Unicode HOWTO?他们会帮助你理解这里发生的事情。
答案 2 :(得分:1)
我认为您确定您的文件是用ASCII编码的。你是? :)由于ASCII包含在UTF-8中,您可以使用UTF-8解码此数据,而不会出现问题。但是,当您确定数据只是ASCII时,您应该使用ASCII而不是UTF-8解码数据。
“如何将其加载为UTF8?”
我相信你的意思是“如何将其作为unicode加载?”。使用ASCII编解码器解码数据,在Python 2.x中,结果数据的类型为unicode
。在Python 3中,结果数据的类型为str
。
您必须阅读有关此主题的内容,以了解如何在Python中执行此类解码。一旦理解,这很简单。