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

news2024/12/23 15:59:37

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

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

文本文件是基于字符编码的文件,通常文件头有“字节序标记”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  测试文本文件编码方案例程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个字节
            //打印BOM
            System.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.coloradmin.cn/o/2164579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringSecurity-用户认证

1、用户认证 1.1 用户认证核心组件 我们系统中会有许多用户&#xff0c;确认当前是哪个用户正在使用我们系统就是登录认证的最终目的。这里我们就提取出了一个核心概念&#xff1a;当前登录用户/当前认证用户。整个系统安全都是围绕当前登录用户展开的&#xff0c;这个不难理…

百度在线翻译神器?这3款工具让你秒变语言达人!

在数字化的今天&#xff0c;我们早已离不开在线翻译工具了&#xff01;从日常的简单翻译到专业级的文献翻译&#xff0c;这些翻译工具就像是我们的“翻译官”&#xff0c;为我们的生活带来了便利&#xff1b;在这里&#xff0c;我给大家分享一下我的百度在线翻译使用感受&#…

Elasticsearch 分片迁移与移除集群节点操作

Elasticsearch 分片迁移与移除集群节点操作 问题背景 在单台服务器上部署了 7 个 Elasticsearch 节点&#xff0c;分别为 es-node1 到 es-node7&#xff0c;端口从 9201 到 9207。每个节点都承载大量数据&#xff0c;但没有设置副本分片。由于多个节点共享同一台服务器的硬件…

自动化测试常用函数:弹窗、等待、导航、上传与参数设置

目录 一、弹窗 1. 警告弹窗确认弹窗 2. 提示弹窗 二、等待 1. 强制等待 2. 隐式等待 3. 显示等待 三、浏览器导航 1. 打开网站 2. 浏览器的前进、后退、刷新 四、文件上传 五、浏览器参数设置 1. 设置无头模式 2. 页面加载策略 一、弹窗 弹窗是在页面是找不到任何…

震撼!最强开源模型通义千问2.5 72B竟在4GB老显卡上成功运行!

炸裂&#xff01;最强开源模型一夜之间易主。阿里发布千问2.5模型&#xff0c;72B版本在MMLU、MATH、MBPP等大部分评测指标上都超过了Llama3 405B&#xff0c;甚至一些指标也超过了GPT4o。正式加冕最强开源模型新王&#xff01; 今天要挑战用我的4GB老显卡不做量化、不做压缩&…

光伏仿真:排布设计如何优化用户体验?

1、屋顶绘制精准 光伏系统的性能直接受到屋顶结构的影响&#xff0c;因此&#xff0c;屋顶绘制的精准性是光伏仿真设计的首要任务。现代光伏仿真软件通过直观的界面和强大的图形编辑功能&#xff0c;使得用户能够轻松导入或绘制出待安装光伏系统的屋顶形状。无论是平面屋顶、斜…

LLM - 使用 XTuner 指令微调 多模态大语言模型(InternVL2) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142528967 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 XTuner…

国庆节到了,扣子智能体coze画板功能实现贺卡编辑智能体自动添加logo和二维码,让海报品牌化

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300+款以上的AI应用工具。关注科技及大模型领域对社会的影响10年+。关注我一起驾驭AI工具,拥抱AI时代的到来。 自媒体时代,不管是一个人、一个团队还是一家公司,都是一个IP。那么添加品牌的标志…

JavaWeb校园二手交易平台

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展&#xff0c;越来越多的应用层出不穷&#xff0c;伴随着数据应用的需求变多&#xff0c;为快速响应业务需求&#xff0c;很多企业在初期没有很好的规划的情况下&#xff0c;存在不同程度的烟囱式的开发模式&#xff0c;这样会导致企业不同业务线的数据…

Java Map类

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Java 目录 &#x1f449;&#x1f3fb;map1. 常见的实现2. 主要方法2.1. put(K key, V value)2.2. get(Object key)2.3. remove(Object key)2.4. containsKe…

西部移动硬盘怎么恢复数据?4种详细且实用的方法

面对西部移动硬盘数据丢失的问题&#xff0c;用户往往感到焦虑和无助。本文将为您提供一系列详细且实用的数据恢复方法&#xff0c;帮助您轻松应对数据丢失的挑战&#xff0c;重拾宝贵信息。 图片来源于网络&#xff0c;如有侵权请告知 一、西部移动硬盘数据丢失原因 西部移动…

生成式AI在电商场景的应用、前景与挑战,零基础入门到精通,收藏这一篇就够了

编者按 百舸争流的AI时代&#xff0c;“AI”行动在千行百业迅速开展。电商是一个重要场景&#xff0c;**据阿里调研&#xff0c;在电商平台&#xff0c;约30%受访商家已经使用生成式AI&#xff0c;成为生成式AI技术普惠的最佳试验场之一。**目前&#xff0c;已使用生成式AI的商…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署经典扫雷小游戏

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下部署经典扫雷小游戏 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 扫雷小游戏简介2.3…

KPaaS平台用户权限管理系统方案之表单设计统一单据制作与授权

不同的业务系统各自独立运行&#xff0c;需要分别进行授权操作&#xff0c;这不仅繁琐耗时&#xff0c;还容易出现错误和不一致的情况&#xff0c;导致企业在多系统用户权限角色管理中常常陷入困境&#xff0c;那么&#xff0c;有没有一种高效、便捷的解决方案呢&#xff1f; …

关于预处理详解,#define,宏的使用以及命名 函数与宏的区别详细对比

预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff…

汉诺塔的理解

数学思想——归纳推理&#xff08;不是反证法&#xff09; 为了方便&#xff0c;我把塔叫做牌&#xff0c;最左边的是从大到小&#xff08;底部开始&#xff09;放置的的牌堆。 数字的那一列是递归调用&#xff0c;右边长度不一的箭头是&#xff0c;数字阶段向下调用方法的情况…

稀土抗菌剂在涂料中应用的神奇表现

稀土抗菌剂的抗菌抑菌机理有四个层面:一是稀土化合物与细菌表面静电结合&#xff0c;造成直接的杀灭二是基于稀土的光催化半导体特性&#xff0c;通过光生氧自由基ROS机理杀灭细菌;三是稀土化合物破坏细胞膜通透性&#xff0c;造成破损导致细胞质流出杀灭细菌;四是稀土离子跨膜…

C标准库<string.h>-str、strn开头的函数

char *strcat(char *dest, const char *src) 函数功能 strcat 函数用于将一个字符串追加到另一个字符串的尾部。 参数解释 dest&#xff1a;指向目标字符串的指针&#xff0c;这个字符串的尾部将被追加 src 字符串的内容。src&#xff1a;指向源字符串的指针&#xff0c;其…

最精简的VScode Verilog RTL开发环境搭建教程

【2024-9月更新】最精简的VScode Verilog RTL开发环境搭建教程 文章目录 【2024-9月更新】最精简的VScode Verilog RTL开发环境搭建教程一、官网下载VScode二、登录账号同步三、安装配置拓展插件1.Verilog-HDL/systemVerilog拓展2.安装Universal Ctags● Windows系统安装univer…