字符集JAVA

举例:

我们之前在读取文件的时候,文件中都是用英文举例,
如果文件内有中文,读取会发生什么

举例:
image.png
进行读取,

//创建字节输入流对象
FileInputStream fis=new FileInputStream("..\\ioDemo\\a.txt");
//循环读取,(无参read一次读取一个字节)
int len;//表示每次读取到的ascii码
while((len=fis.read())!=-1){
    System.out.print((char) len);
}
//释放资源
fis.close();

image.png
可以发现,英文正常读取,而中文部分乱码。

***若此时在Hello这五个字符后再添加一个任意字符字符,
也就是6个字母+2个中文
并且我手动采取一次读取三个字节的解码规则
此时再读取还会报错吗?
image.png

public class t {
    public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("..\\ioDemo\\a.txt");
//循环读取,
byte[] bytes = new byte[3];//(一次读取三个字节)
int len;
while ((len = fis.read(bytes)) != -1) {
    String str = new String(bytes, 0, len);//获取每一次读取到的元素
    System.out.println(str);//打印
}
//释放资源
fis.close();
    }
}

image.png
由此可以,
我当前系统的默认编码规则是:一个英文字母占一个字节、一个中文占三个字节。


为了了解为什么乱码?,如何才能不乱码?
我们就要学习,计算机存储规则以及字符集。


计算机存储规则:

在计算机中,任意数据都是以二进制的形式存储的,如00111000
一串二进制数就代表着某个数据
字节是计算机最小的存储单元。


字符集

一、字符集的介绍

字符集就像是一本字典,当电脑想要知道某串二进制数代表的真实数据,就需要查询该串二进制数在字典上所表示的数据,(字典上已经记录了该二进制数和真实数据的对应关系)。
而乱码出现的原因 其实就是查错了字典,如,汉字字典用拼音表示,牛津字典用音标表示,当我们要查某个汉字时,拿牛津字典当然查到的不是正确的数据
例如:拼音tan表示的中文有很多,就拿“”来说,而在英文中tan的含义是“棕褐色的
这就是不同字符集之间的差异;字符集是计算机二进制数据的字典。

字符集分类:

Ascii:

ASCII码是一种基于英文字符的编码系统,主要用于计算机通信。**标准ASCII码使用7个二进制位(每个字符占用一个位)来表示128个不同的字符。**这是因为2的7次方等于128,所以标准ASCII码能够表示的最大字符数量是128个。123
除此之外,还有一种称为扩展ASCII码的编码方式,它使用8个二进制位来表示额外的128个字符。这样,扩展ASCII码总共能表示256个字符,这包括了更多的符号类型,如拉丁字母、数字、标点符号以及一些特殊用途的控制字符。

只有英文的编码规则,一个英文占一个字节,前面补0,补齐八位
如:
image.png

一共才128个字符,也就是只要一个字节即可表示完,28 =256

image.png


GBK

简体中文版WINDOWS默认使用GBK字符集:系统显示:ANSI

有中文、英文的编码规则:

  • 英文编码规则(完全兼容ASCII):一个字节,不足8位,前面补0,如:

image.png

  • 中文编码规则:每个汉字两个字节存储、高位字节二进制一定以1开头,转成十进制后是一个负数

image.png

  • 为什么一定要是1开头呢?
    • 为了和英文区分,而Ascii码英文以及字符一共才128个,最高位二进制一定是0
  • 练习:
    • image.png

规则:
image.png


Unicode(完全兼容ASCII)

国际标准字符集,它将世界各种语言的每个字符定义为唯一的编码,以满足跨语言、跨平台的文本信息转换。

有中文、英文的编码规则(这里指的是Unicode的 UTF-8编码规则)
UTF-8的编码规则(二进制):

用1-4个字节保存,
英文:1个字节(最高位是0),转成二进制是正数
中文:三个字节(最高位是1),第一个字节转成十进制是负数

image.png
”汉“ 查询Unicode是27721转换成二进制 01101100 01001001 UTF-8编码变成:11100110 10110001 10001001

注意:UTF-8不是一个字符集,它是Unicode字符集的一种编码方式!

练习:
image.png


了解完了字符集,应该也知道了乱码的原因了,
image.png

那么如何才能不乱码?

  1. 不要用字节流读取文本文件(一次只会读取一个字节,不管文本使用的是GBK还是Unicode编码规则,都会导致中文二进制部分的读取缺失)
  2. 编码、解码时使用同一个码表,同一个编码方式

Snipaste_2024-02-06_13-08-03.png

编码就是把真实数据变成一串二进制数,
解码就是把这一串二进制数,使用一定的规则得到真实数据
编码方法的返回值是一个字节数组
解码方法的返回值是一个字符串

编码,解码使用同一个编码方式:

public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {


//文本
String str="Hello世界";

//编码
byte[] bytes1 = str.getBytes();//使用默认的编码方式UTF-8(我的系统),一个英文一个字节,一个中文三个字节
System.out.println(Arrays.toString(bytes1));//[72, 101, 108, 108, 111, -28, -72, -106, -25, -107, -116]

byte[] bytes2 = str.getBytes("GBK");//使用GBK编码方法,一个英文一个字节,一个中文两个字节
System.out.println(Arrays.toString(bytes2));//[72, 101, 108, 108, 111, -54, -64, -67, -25]

//解码:
String str2=new String(bytes1);//对bytes1使用默认的解码方式(UTF-8)
System.out.println(str2);//Hello世界-------无误

String str3=new String(bytes1,"GBK");//对bytes2使用GBK解码方法
System.out.println(str3);//Hello涓栫晫---------使用UTF-8编码,GBK解码,直接乱码,因为中文的存储规则不同

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

市场复盘总结 20240206

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 今日梯队: 二进三&#xff1a…

11_树莓派_树莓派外设板_PWM_彩虹灯

目录 1.树莓派外设集成板总体介绍 2.第二部分 PWM 树莓派_树莓派外设板_PWM_RGB彩虹灯 3.代码及实现 1.树莓派外设集成板总体介绍 1)前言:这是一块为了验证树莓派【兼容树莓派多个型号】的40pins的外设接口的外接板,告别复杂的面包板外设…

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

读分布式稳定性建设指南文档

最近还是在做一些和稳定性建设相关的事情,找到一份《分布式稳定性建设指南》文档,摘抄了其中的重点,以便后续回顾方便,一直没上传好资源,我之后再试试,原文内容质量非常高。 大家可以先看一级目录即可&…

《Git 简易速速上手小册》第4章:Git 与团队合作(2024 最新版)

文章目录 4.1 协作流程简介4.1.1 基础知识讲解4.1.2 重点案例:为 Python Web 应用添加新功能4.1.3 拓展案例 1:使用 CI/CD 流程自动化测试4.1.4 拓展案例 2:处理 Pull Request 中的反馈 4.2 使用 Pull Requests4.2.1 基础知识讲解4.2.2 重点案…

《Python 网络爬虫简易速速上手小册》第10章:未来展望与新兴技术(2024 最新版)

文章目录 10.1 机器学习在爬虫中的应用10.1.1 重点基础知识讲解10.1.2 重点案例:使用机器学习进行自动化内容抽取10.1.3 拓展案例 1:利用深度学习识别复杂的网页结构10.1.4 拓展案例 2:机器学习辅助的动态反反爬虫策略 10.2 处理 JavaScript …

《C程序设计》上机实验报告(八)之结构体和共用体

实验内容&#xff1a; 1.运行程序 #include <stdio.h> struct mn { int x,*y; }; void main() { int a[]{15,20,25,30}; struct mn aa[]{35,&a[0],40,&a[1],45,&a[2],50,&a[3]},*p; paa; printf("%d",p->x); printf("%d",(p)…

Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器

本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例&#xff0c;我们将其用于 BM25 示例。 在这个例子中&#xff1a; 我们将摄取 LangChain 之外的电影样本数据集自定义 ElasticsearchStore 中的检索策略以仅使用 BM25使用自查询检索将问题转…

【成品论文】2024美赛B题完整成品论文23页+3小问matlab代码+数据集汇总

2024 年美国大学生数学建模竞赛&#xff08;2024 美赛&#xff09;B 题&#xff1a; 2024 MCM 问题 B: 搜寻潜水艇 题目翻译&#xff1a; Maritime Cruises Mini-Submarines (MCMS)是一家总部位于希腊的公司&#xff0c;专门制造能够携 带人类到达海洋最深处的潜水艇。潜水艇是…

力扣53. 最大子数组和(滑动窗口,动态规划)

Problem: 53. 最大子数组和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 思路1:滑动窗口 1.为求出最大连续的子数组和,我们逻辑上假设有一个窗口在原数组上滑动, 欲求出最大连续,则需要保证窗口中的所有元素和最起码大于0; 2.即当当前窗口中的元素值的和小于0…

当AGI遇到人形机器人

为什么人类对人形机器人抱有执念 人形机器人是一种模仿人类外形和行为的机器人&#xff0c;它的研究和开发有着多方面的目的和意义。 人形机器人可以更好地适应人类的环境和工具。人类的生活和工作空间都是根据人的尺寸和动作来设计的&#xff0c;例如门、楼梯、桌椅、开关等…

改变终端安全的革命性新兴技术:自动移动目标防御技术AMTD

自动移动目标防御技术通过启用终端配置的自适应防御来改变终端检测和响应能力。产品领导者可以实施AMTD来确保实时威胁响应&#xff0c;并减少检测和响应安全威胁所需的时间。 主要发现 通过动态修改系统配置、软件堆栈或网络特征&#xff0c;自动移动目标防御&#xff08;AMTD…

Retinexformer论文精读笔记

Retinexformer论文精读笔记 论文为2023年ICCV的Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement。论文链接&#xff1a;browse.arxiv.org/pdf/2303.06705.pdf&#xff0c;代码链接&#xff1a;caiyuanhao1998/Retinexformer: “Retinexfo…

初次认识和学习SEO

初探 SEO 初探 SEO SEO 的基本概念 搜索引擎优化&#xff08;英语&#xff1a;search engine optimization&#xff0c;缩写为 SEO&#xff09;&#xff0c;是一种透过了解搜索引擎的运作规则来调整网站&#xff0c;以及提高目的网站在有关搜索引擎内排名的方式 一般的可以理…

k8s 网络策略揭秘:CKA认证必备的网络知识全解析

网络策略&#xff08;NetworkPolicy&#xff09;是Kubernetes中的一种资源对象&#xff0c;用于定义和控制Pod之间的网络通信规则。它允许您在Kubernetes集群中定义详细的网络规则&#xff0c;以控制哪些Pod可以相互通信&#xff0c;以及允许或禁止的流量。网络策略提供了一种实…

【MATLAB源码-第137期】基于matlab的NOMA系统和OFDMA系统对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOMA&#xff08;非正交多址&#xff09;和OFDMA&#xff08;正交频分多址&#xff09;是两种流行的无线通信技术&#xff0c;广泛应用于现代移动通信系统中&#xff0c;如4G、5G和未来的6G网络。它们的设计目标是提高频谱效…

泛型、Trait 和生命周期(上)

目录 1、提取函数来减少重复 2、在函数定义中使用泛型 3、结构体定义中的泛型 4、枚举定义中的泛型 5、方法定义中的泛型 6、泛型代码的性能 每一门编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型&#xff08;generics&#xff09;。泛型是具体类型…

Verilog刷题笔记18

题目&#xff1a;An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false. 解题&#xff1a; module top_module(input a,input b,input sel_b1,input sel_b2,output wire ou…

【excel密码】Excel加密的三种方式

Excel中保存着重要的数据&#xff0c;想要保护数据源&#xff0c;我们会想到给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff…

数据库中间件介绍

数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和大规模应用中&#xff0c;数据库中间件发挥着重要的作用。 什么是数据库中间件&#xff1f; 数据库中间件是一种介…