python 字符串编码 ,区别 utf-8 和utf-8-sig
Python 读取文件首行多了"\ufeff"字符串
python读取B.txt文件时,控制台打印首行正常,但是若是用首行内容打开文本的话,就会报错:
Traceback (most recent call last): A File "E:/python project/multiProcess/test.py", line 32, in <module> with open("%s.txt" % line, 'r', encoding='utf-8') as f1: FileNotFoundError: [Errno 2] No such file or directory: '\ufeffA.txt'
要打开的路径比预期A.txt多了一串字符"\ufeff", 显然无法正确打开文件.
解决方案:
在读取B.txt 时,指定编码方式为 "utf-8-sig"即可 如下:
with open("B.txt", 'r', encoding='utf-8-sig') as f: line = f.readline()[0:-1] #去掉末尾换行符 print(line) with open("%s.txt" % line, 'r', encoding='utf-8') as f1: print(f1.readline()) f1.close() f.close()
首行出现的”\ufeff“叫BOM("ByteOrder Mark")用来声明该文件的编码信息.
”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生类似上边的错误.
"uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8", 因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.
原文:https://blog.csdn.net/wozaizhe56/article/details/82048645
-
摘要:问题描述:json.loads(text,encoding='utf8')报UnexpectedUTF-8BOM(decodeusingutf-8-sig)错误,将encoding改为'utf-8-sig'仍然报错。原因分析:text包含BOM字符解决方案:将BOM头去掉
-
问题描述:
json.loads(text,encoding='utf8') 报Unexpected UTF-8 BOM (decode using utf-8-sig)错误,将encoding改为'utf-8-sig'仍然报错。
原因分析:
text包含BOM字符
解决方案:
将BOM头去掉,代码如下:
if text.startswith(u'/ufeff'):
text = text.encode('utf8')[3:].decode('utf8')
链接:https://www.jianshu.com/p/f94b3fc04f5b