二进制文件与文本文件的区别【字符集Charset】

计算机上存储的文件在比特位上都是以二进制数字0或1表示,因此在物理层面上,文本文件和二进制文件没有本质差异,都是由数字0或1组成的比特位集合。

文本文件和二进制文件,两者的差异体现在编码逻辑,需要根据文件头中标记来区分。

文本文件是基于字符编码的文件,通常文件头有“字节序标记”BOM。什么是BOM?
不同的字符编码方案有固定的BOM标记。文本读写应用程序通常是根据BOM来确认文本的编码格式,然后才能处理文件中的信息。
在这里插入图片描述

二进制文件由二进制数字0和1组成,不同应用有不同的编码方案,通常也有文件头信息。。例如,音频、视频和图像文件都属于二进制文件,它们也各有编码方案,需要专用程序来处理。有的二进制文件也有“字节序标记”BOM,其作用主要为了确认编码是大端还是小端,用于确认编码方案中每组字节的编码排列顺序。

比如 bmp文件,它的文件头信息,前2个字节表示文件格式为BMP格式,接着的 8个字节表示文件的长度,再接着的4个字节表示 bmp文件头的长度。然后再根据BMP文件的编码方案可以解释出绘制图像。

win10系统文本文件的编码方案
win10系统默认的字符集(Charset)是GBK。
我们可用下面的Java程序来打印win10系统默认的字符集,以及支持的字符集:

/**** @author QiuGen* @description  系统默认字符集(Charset)打印例程CharsetPrn.java* @date 2024/9/16* ***/
import java.nio.charset.Charset;	//程序CharsetPrn.java开始
import java.util.SortedMap;
public class CharsetPrn {public static void main(String[] args) {Charset charset = Charset.defaultCharset(); //获取系统环境的默认字符集名System.out.println("当前系统环境的默认字符集名称");System.out.println(charset);System.out.println("当前系统环境的可用字符集名称");SortedMap<String,Charset> map = Charset.availableCharsets();map.forEach((k,v)->System.out.println(k));}
}

在win10系统下的字符编码方案有以下几种,ASCII,ANSI、UTF-8、带有BOM的UTF-8 、UTF-16LE、UTF-16BE。
win10系统默认的字符集(Charset)编码方案是GBK编码。

这几种编码的特点:

(1) ANSI和ASCII编码: ASCII编码是ANSI编码的子集。ANSI编码是兼容ASCII编码的,如果字节的最高位是0(0-7F),二进制形如0XXX XXXX,表达的是ASCII字符。如果字节的最高位是1(80-FE),则是ANSI(GBK)编码,注意,这时候是两个字节表达一个汉字,也就是说两个字节的最高位都是1的字节代表一个汉字,二进制形如1XXX XXXX, 1XXX XXXX 。

在ANSI编码下,如果文本字符都是西文字符,则也可以认为是ASCII编码,当有连续高为是1的字节串出现的时候,这是可以判定为ANSI或GBK编码。GBK编码一定是两个高位均为1的字节表达一个汉字。ANSI每个字节的高位可以是1或0,若字节高位是0,则一个字节表达一个ASCII字符。

(2) UTF-8编码:utf-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节。即在文本全部是ASCII字符时utf-8是和ASCII一致的(utf-8向下兼容ASCII)。最多6个字节表达一个字符,utf-8字节编码如下所示:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx ,一般汉字用这个3字节表达
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
注意,在UTF-8编码中,多种长度是混合存在的,一个字符串可能有1,2,…,6个字节来表示的字符同时存在 。因此UTF-8编码太复杂,效率较低。

(3)有“字节序标记”BOM的UTF-8,其文本文件的头部带有“字节序标记”BOM:0xEF, 0xBB,0xBF,通过判断这个标志,可以判断出这个文本文件是UTF-8编码。

(4)UTF-16LE,字节序是little endian ,是双字节等长编码。文本文件头部带有“字节序标记”BOM:0xFF 0xFE,通过判断这个标志,可以判断出这个文本文件是UTF-16LE编码。

(5) UTF-16BE, 字节序是big endian,是双字节等长编码。文本文件头部带有“字节序标记”BOM:0xFE 0xFF,通过判断这个标志,可以判断出这个文本文件是UTF-16BE编码。

下面是一个根据“字节序标记”BOM测试文本文件编码方案的例程:

/**** @author QiuGen* @description  根据BOM测试文本文件编码方案例程* FileCharsetDetector.java* @date 2024/9/16* ***/
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class FileCharsetDetector {public static void main(String[] args) {String filePath = "D:/temp/测试文档2.txt";try (FileInputStream in = new FileInputStream(filePath)) {Charset charset = null;int bom[] = new int[3];bom[0] = in.read(); //读第1个字节bom[1] = in.read(); //读第2个字节bom[2] = in.read(); //读第3个字节//打印BOMSystem.out.println("BOM:"+Integer.toHexString(bom[0])+Integer.toHexString(bom[1])+Integer.toHexString(bom[2]));if (bom[0] == 0xFE && bom[1] == 0xFF) {charset = StandardCharsets.UTF_16BE;} else if (bom[0] == 0xFF && bom[1] == 0xFE) {charset = Charset.forName("UTF-16LE");} else if (bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF) {charset = StandardCharsets.UTF_8;} else {charset = Charset.forName("GBK");}System.out.println("文件字符编码: " + charset.name());} catch (IOException e) {e.printStackTrace();}}}

在win10环境,使用文本编辑器应用程序“记事本”,分别编写四个文件分别保存为UTF-16LE、 UTF-16BE、UTF-8和ANSI编码格式的文本。进行测试,UTF-16LE和 UTF-16BE能准确打印出BOM,下图是UTF-16LE的测试结果。

在这里插入图片描述
UTF-8和ANSI编码格式的文本,测试结果一样,如下所示:
在这里插入图片描述
由此说明Win10的UTF-8文本文件文件头中没有标准的“字节序标记”BOM。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PVE虚拟机被锁定locked解决方法

打开pve节点的shell&#xff0c;执行以下命令 qm unlock <VMID> 示例&#xff1a; qm unlock 112

伊犁云计算22-1 apache 安装rhel8

1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改

SQL Server的文本和图像函数

新书速览|SQL Server 2022从入门到精通&#xff1a;视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…

《数据结构与算法之美》学习笔记五之队列

前情提要&#xff1a;上一章学习了栈相关的知识&#xff0c;主要有下面的内容&#xff1a; 栈操作的时间复杂度&#xff0c;对于顺序栈&#xff0c;入栈时如果栈的空间不够涉及到数据搬移&#xff0c;此时使用摊还分析法&#xff0c;将数据搬移的耗时均摊到不需要搬移数据的入…

【YOLO学习】YOLOv1详解

文章目录 1. 概述2. 算法流程3. 网络结构4. 损失函数 1. 概述 1. YOLO 的全称是 You Only Look Once: Unified, Real-Time Object Detection。YOLOv1 的核心思想就是利用整张图作为网络的输入&#xff0c;直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。简单…

【二十五】【QT开发应用】无边窗窗口鼠标拖动窗口移动,重写mousePressEvent,mouseMoveEvent函数

在 Qt 中&#xff0c;可以通过在自定义的类中重载 mousePressEvent 和 mouseMoveEvent 函数来捕获鼠标按下和移动事件&#xff0c;以便实现例如拖动窗口等功能。 mousePressEvent 和 mouseMoveEvent分别是鼠标按下事件和鼠标移动事件。这两个函数是QT中本身就存在的函数&#…

【2023工业图像异常检测文献】SimpleNet

SimpleNet:ASimpleNetworkforImageAnomalyDetectionandLocalization 1、Background 图像异常检测和定位主要任务是识别并定位图像中异常区域。 工业异常检测最大的难题在于异常样本少&#xff0c;一般采用无监督方法&#xff0c;在训练过程中只使用正常样本。 解决工业异常检…

ROC、TPR、FPR的含义

1、ROC&#xff08;Receiver Operating Characteristic&#xff09; ROC&#xff08;Receiver Operating Characteristic&#xff09;曲线是一种用于评估分类模型性能的工具。它通过绘制真阳性率&#xff08;True Positive Rate, TPR&#xff09;与假阳性率&#xff08;False…

uni-app - - - - - 实现锚点定位和滚动监听功能(滚动监听功能暂未添加,待后续更新)

实现锚点定位和滚动监听功能 1. 思路解析2. 代码示例 效果截图示例&#xff1a; 点击左侧menu&#xff0c;右侧列表数据实现锚点定位 1. 思路解析 点击左侧按钮&#xff0c;更新右侧scroll-view对应的scroll-into-view的值&#xff0c;即可实现右侧锚点定位滚动右侧区域&am…

Chroma 向量数据入门

Chroma 是 AI 原生的开源矢量数据库。Chroma 使知识、事实和技能可插入 LLM&#xff0c;从而可以轻松构建 LLM 应用程序。Chroma 是 AI 原生的开源矢量数据库。Chroma 使知识、事实和技能可插入 LLM&#xff0c;从而可以轻松构建 LLM 应用程序。 &#x1f31f;Chroma是一个文档…

简单的mybatis batch插入批处理

简单的mybatis batch插入批处理 1.需求 公司的权限管理功能有一个岗位关联资源的分配操作&#xff0c;如果新增一个岗位&#xff0c;有时候需要将资源全部挂上去&#xff0c;原有的是for循环插入资源信息&#xff0c;发现有时候执行速度过慢&#xff0c;所以此处想修改为批处…

Spring Cloud Gateway 之动态uri 自定义过滤器

背景&#xff1a;第三方公司 请求本公司入参和出参一样的同一个接口&#xff0c;根据业务类型不一样需要不同业务微服务处理 &#xff0c;和第三方公司协商在请求头中加入业务类型方便我公司在网关成分发请求。 1&#xff1a;在spring cloud gateway yml 中加入路由 重点是 -…

数据结构之搜索二叉树

目录 一、什么是搜索二叉树 基本概念 特点 注意事项 二、搜索二叉树的C实现 2.0 构造与析构 2.1 插入 2.2 查找 2.3 删除 2.3.1 无牵无挂型 2.3.2 独生子女型 2.3.3 儿女双全型 三、搜索二叉树的应用 3.1 key搜索 3.2 key/value搜索 一、什么是搜索二叉树 搜索二…

数值计算 --- 平方根倒数快速算法(中)

平方根倒数快速算法(中) --- 向Greg Walsh致敬&#xff01; 在前面的介绍中&#xff0c;我们已经知道了这段代码的作者Greg Walsh在函数的最后使用了NR-iteration&#xff0c;且只用了一次NR-iteration就能达到比较理想的精度。这样一来&#xff0c;选择正确的初值就显得尤为重…

云原生|浅谈云原生中的对象存储之MinIO 的使用

一、什么是对象储存 对象存储&#xff08;Object Storage&#xff09;以对象的形式存储和管理数据&#xff0c;这些对象可以是任何类型的数据&#xff0c;例如 PDF&#xff0c;视频&#xff0c;音频&#xff0c;文本或其他文件类型。对象存储使用分布式存储架构&#xff0c;数据…

C语言贪吃蛇小游戏演示和说明

C语言贪吃蛇小游戏演示和说明 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础&#xff0c;训练编程思维&#xff0c;培养解决问题的思路&#xff0c;领略多姿多彩的C语言。 游戏开始后&#xff0c;会在中间位置出现一条只有三个节点的贪吃蛇&#xff0c;并随机出现一个食物&am…

数据结构练习题————(二叉树)——考前必备合集!

今天在牛客网和力扣上带来了数据结构中二叉树的进阶练习题 1.二叉搜索树与双向链表———二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 2.二叉树遍历————二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 3.二叉树的层序遍历————102. 二叉树的层序遍历 - 力扣&am…

寿司检测系统源码分享

寿司检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

一文了解高速工业相机

超高速相机是工业相机的一种&#xff0c;一般高速相机指的是数字工业相机&#xff0c;其一般安装在机器流水线上代替人眼来做测量和判断&#xff0c;通过数字图像摄取目标转换成图像信号&#xff0c;传送给专用的图像处理系统。 超高速工业相机的采集速率> 50Gb/s&#xff…

window系统DockerDesktop 部署windows容器

目录 参考文献1、安装Docker Desktop1.1 下载安装包1.2 安装教程1.3 异常解决 2、安装windows容器2.1 先启动DockerDesktop 软件界面2.2 检查docker版本2.3 拉取windows镜像2.4 网盘下载windows镜像 参考文献 windows容器docker中文官网 Docker: windows下跑windows镜像 1、安…