以Win 10为例,假设当前文件夹中有个ANSI编码的文本文件data.txt,其中包含若干行文本,每行存放一个整数,例如:
编写程序读取其中的每行数字,加5之后输出,代码如下:
接下来,使用记事本打开文件data.txt,然后另存为UTF8编码格式,
然后修改代码,使用UTF8编码格式,代码出错,
根据异常信息可以发现,莫名其妙多出来一个字符,ufeff,然而输出文件内容时却又没有这个符号,例如,
出现这个错误的原因在于,Windows系统的记事本程序转换为UTF8时,会在文件头增加BOM(Byte Order Mark),也就是标志位ufeff,这个符号使用print()输出时不可见,使用repr()函数转换一下,
Windows记事本转换为UTF8编码时加BOM本身并没有对与错,但是没有明确说明就不合适了,还是notepad 人性化一些,明确对不带BOM的utf8和带BOM的utf8做了区分,例如,
不管怎么样,明白了原因之后,处理就容易了,可以手动删除这个符号,
或者,改用utf-8-sig编码格式来读取内容,