当前位置: 首页 > news >正文

python3检测文件的编码格式_python判断文件的编码格式是否为UTF8 无BOM格式

首先普及下知识:

1、BOM: Byte Order Mark

BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。

Byte-order mark Description

EF BB BF UTF-8

FF FE UTF-16 aka UCS-2, little endian

FE FF UTF-16 aka UCS-2, big endian

00 00 FF FE UTF-32 aka UCS-4, little endian.

00 00 FE FF UTF-32 aka UCS-4, big-endian.

所以对于UTF8只要判断文件头包含EF BB BF,就可以判断它是有BOM的了。

2、再了解下UTF8的具体编码格式,UTF8算是一种自适应的,长度不定,兼容ASCII编码。

unicode(U+)

utf-8

U+00000000 - U+0000007F:

0xxxxxxx

U+00000080 - U+000007FF:

110xxxxx10xxxxxx

U+00000800 - U+0000FFFF:

1110xxxx10xxxxxx10xxxxxx

U+00010000 - U+001FFFFF:

11110xxx10xxxxxx10xxxxxx10xxxxxx

也就是说,在Unicode的编码的基础上规定了一种编码格式,根据每个字节的开头的固定格式,我们就可以判断是否是UTF8的编码

OK 基础知识大致普及完毕,然后看一看代码的实现。

#!/usr/bin/env python

#coding:utf-8

import sys,codecs

def detectUTF8(file_name):

state = 0

line_num = 0

file_obj = open(file_name)

all_lines = file_obj.readlines()

file_obj.close()

for line in all_lines:

line_num += 1

line_len = len(line)

for index in range(line_len):

if state == 0:

if ord(line[index])&0x80 == 0x00:#上表中的第一种情况

state = 0

elif ord(line[index])&0xE0 == 0xC0:#上表中的第二种情况

state = 1

elif ord(line[index])&0xF0 == 0xE0:#第三种

state = 2

elif ord(line[index])&0xF8 == 0xF0:#第四种

state = 3

else:

print "%s isn't a utf8 file,line:\t"%file_name+str(line_num)

sys.exit(1)

else:

if not ord(line[index])&0xC0 == 0x80:

print "%s isn't a utf8 file in line:\t"%file_name+str(line_num)

sys.exit(1)

state -= 1

if existBOM(file_name):

print "%s isn't a standard utf8 file,include BOM header."%file_name

sys.exit(1)

def existBOM(file_name):

file_obj = open(file_name,'r')

code = file_obj.read(3)

file_obj.close()

if code == codecs.BOM_UTF8:#判断是否包含EF BB BF

return True

return False

if __name__ == "__main__":

file_name = 'code.txt'

detectUTF8(file_name)

OK,大致就是这些,只要熟悉编码格式,python代码的实现也就不算难。

PS:python的编码真是太痛苦了,不同版本还有所不同。如果在导入其它的模块也可能出现编码问题。。。

相关文章:

  • git-2.29.2.2-64-bit安装_FairRoot安装注意事项
  • java执行sql文件_Mybatis进阶笔记:架构概述与基本执行流程梳理
  • catia二次开发_CATIA二次开发文件双手奉上,重命名非参后的CATPart
  • admin manager_Hadoop - 企业级大数据管理平台CDH(安装cloudera-manager)
  • python如何打印字符串_python 中 打印及格式化字符串的相关方法
  • selenium firefox驱动_[Selenium]2.开发环境配置
  • js regexp 匹配任意一个字符串_JavaScript基础知识:字符串的使用和基本操作
  • python列表的存储结构_3-Python内置结构-列表
  • 用python制作新用户注册系统_[宜配屋]听图阁
  • python中typeerror_Python中的TypeError类
  • python手工打码_打码兔和超人打码python版
  • python 将图片转换成像素画_Python用61行代码实现图片像素化
  • python实现自动翻页代码_python实现模拟按键,自动翻页看u17漫画
  • excel万年历_excel函数应用技巧:如何按不同要求,改变数值格式
  • python哪些领域_什么是Python?Python涉及哪些领域?
  • 【mysql】环境安装、服务启动、密码设置
  • 2019.2.20 c++ 知识梳理
  • Git同步原始仓库到Fork仓库中
  • java2019面试题北京
  • Laravel核心解读--Facades
  • Mithril.js 入门介绍
  • mysql 数据库四种事务隔离级别
  • 从tcpdump抓包看TCP/IP协议
  • 构建二叉树进行数值数组的去重及优化
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 人脸识别最新开发经验demo
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我的zsh配置, 2019最新方案
  • 应用生命周期终极 DevOps 工具包
  • 正则表达式
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 阿里云服务器如何修改远程端口?
  • ​queue --- 一个同步的队列类​
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (笔试题)分解质因式
  • (十三)Maven插件解析运行机制
  • (转)setTimeout 和 setInterval 的区别
  • . Flume面试题
  • .naturalWidth 和naturalHeight属性,
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 6 redis操作类
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • [ C++ ] 继承
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 第一章] JavaScript 简史
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [CTF]2022美团CTF WEB WP
  • [Django 0-1] Core.Checks 模块
  • [FTP]pureftp部署和优化
  • [HDU5685]Problem A