1.BOM问题
python读取文件时常会出现如下异常:
print (file.read().decode(‘utf-8’)).encode(‘gbk’)
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\ufeff’ in position 0: illegal multibyte sequence
这是因为有些软件在保存UTF-8编码时,会在文件最开始的时候插入不可见的字符BOM(0xEF 0xBB 0xBF,即BOM),这些不可见的字符无法被解析,它们是用来区分Unicode big endian和Unicode little endian(即高字节写在前面还是后面)的,可以利用codecs模块处理这个问题:
import codecs
content = open('test.txt', 'r').read()
filehandler.close()
if content[:3] == codecs.BOM_UTF8:
content = content[3:]
print (content.decode('utf-8'))
2.读Unicode文件时出现无法解码问题
windows下用记事本保存带中文的文本时,可以保存为utf-8或Unicode。Unicode分为大端格式(Big endian)和小端格式(little endian),不管用哪一种格式保存,当用python打开该文件时,会出现无法解码的问题,即抛出如下异常:
content = file.read()
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xff in position 0: illegal multibyte sequence
上述异常是打开小端格式的文件时抛出的,打开大端格式的文件时起始位置则是0xfe。
抛出上述异常是因为python默认编码是ANSI,无法打开unicode编码文件,可以通过sys.setdefaultencoding()
来修改(要调用sys.setdefaultencoding
函数,需要重载sys
模块,即reload sys
),也可以在open函数时设定参数encoding来解决:
with open("test3.txt", encoding="utf-16") as file:
content = file.read()
utf-16代表unicode编码格式。