【Java基础篇】常见的字符编码、以及它们的区别

在这里插入图片描述

常见的字符编码、以及它们的区别

  • ✔️ 解析
  • ✔️扩展知识仓
    • ✔️Unicode和UTF-8有啥关系?
    • ✔️有了UTF-8,为什么要出现GBK
    • ✔️为什么会出现乱码


✔️ 解析


就像电报只能发出 ”滴” 和 ”答” 声一样,计算机只认识 0 和 1 两种字符,但是,人类的文字是多种多样的,如何把人类的文字转换成计算机认识的01字符呢,这个过程同样需要通过字符编码。


字符编码(Character encoding) 是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。


和摩尔斯电码功能类似,上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,这被称为 ASCII 码,一直沿用至今。


由于ASCI只有128个字符,虽然对于英文字符都可以表示了,但是世界上还有很多其他的文字他是没办法表示的,所以需要一种更加全面的字符编码。


于是又出现了 Unicode 字符集 (常见的Unicode Transformation Format 有: UTF-7, UTF-7.5,UTF.
8,UTF-16,以及 UTF-32) ,除此之外还有一些常用的中文编码有GBK,GB2312,GB18030等。


✔️扩展知识仓


✔️Unicode和UTF-8有啥关系?


Unicode (中文: 万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。


Unicode备受认可,并广泛地应用于计算机软件的国际化与本地化过程。有很多新科技,如可扩展置标语言(Extensible Markup Language,简称: XML)、Java编程语言以及现代的操作系统,都采用Unicode编码。


Unicode是一套通用的字符集,包含世界上的大部分文字,也就是说,Unicode是可以表示中文的。


但是,Unicode虽然统一了全世界字符的编码,但没有规定如何存储


因为如果 Unicode 统一规定,每个符号就要用三个或四个字节表示,因为字符太多,只能用这么多字节才能表示完全。一旦这么规定,那么每个英文字母前都必然有二到三个字节是0,因为所有英文字母在 ASCII 中都有,都可以用一个字节表示,剩余字节位置就要补充0。如果这样,文本文件的大小会因此大出二三倍,这对于存储来说是极大的浪费。


为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF (UnicodeTransformation Format) 。常见的UTF格式有: UTF-7, UTF-7.5, UTF-8,UTF-16,以及 UTF-32


UTF-8 使用一至四个字节为每个字符编码
UTF-16 使用二或四个字节为每个字符编码
UTF-32 使用四个字节为每个字符编码


所以我们可以说,UTF-8、UTF-16等都是 Unicode 的一种实现方式


✔️有了UTF-8,为什么要出现GBK


因为UTF-8是Unicode的一种实现,所以他包含了世界上的所有文字的编码,他采用的是1-4字节进行编码。


对于那些排在前面优先纳入的文字,可能就优先使用1字节、2字节存储了,对于后纳入的文字,就要使用3字节或者4字节存储了。


正是因为UTF-8太全了,所以那些晚一些纳入的字符,在UTF-8中的存储所占的字节数可能就会多些,那他的存储空间要求就会很大


对于常用的汉字,在UTF-8中采用3字节进行编码,但是如果有一种只包含中文和ASCI的编码的话,就不需要使用3个字节,可能2个字节就够了。


对于大部分网站来说,基本都是只服务一个国家或者地区的,比如一个中国的网站,一般会出现简体字和繁体字以及一些英文字符,很少会出现日语或者韩文的。


也是出于这样的考虑,中国国家标准总局于1981年制定并实施了 GB 2312-80 编码,即中华人民共和国国家标准简体中文字符集。后来厂 商微软利用GB 2312-80末使用的编码空间,收录GB 13000.1-93全部字符制定了GBK编码。


有了标准中文字符集,如果是一个纯中文网站,就可以可以采用这种编码方式,这样可以大大节省一些存储空间的。


常用的中文编码有GBK,GB2312,GB18030等,最常用的是GBK。


  • GB2312(1980年): 16位字符集,收录有6763个简体汉字,682个符号,共7445个字符:
          优点: 适用于简体中文环境,属于中国国家标准,通行于大陆,新加坡等地也使用此编码
          缺点: 不兼容繁体中文,其汉字集合过少


    GBK(1995年) : 16位字符集,收录有21003个汉字,883个符号,共21886个字符:
          优点: 适用于简繁中文共存的环境,为简体Windows所使用,向下完全兼容gb2312,向上支持ISO-10646 国际标准: 所有字符都可以一对一映射到unicode2.0上;
          缺点: 不属于官方标准,和big5之间需要转换,很多搜索引擎都不能很好地支持GBK汉字


    GB18030(2000年): 32位字符集: 收录了27484个汉字,同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字
          优点: 可以收录所有你能想到的文字和符号,属于中国最新的国家标准;
          缺点: 目前支持它的软件较少。

✔️为什么会出现乱码


文件里面的内容归根到底都是有0101组成的,至于0101的二进制码如何转成人们可以理解的字符串则是需要通过规定好的字符编码标准进行转换才可以。


我们把一串中文字符通过UTF-8进行编码传输给别人,别人拿到这串文字之后,通过GBK进行解码,得到的内容就会是“银届萦银斤拷霍位银斤拷直银斤拷馄”,这就是乱码。

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

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

相关文章

【驱动序列】C#获取电脑硬件基本组合以及基础信息

大家好,我是全栈小5,欢迎阅读《小5讲堂之知识点实践序列》文章。 这是2024年第7篇文章,此篇文章是C#知识点实践序列文章,博主能力有限,理解水平有限,若有不对之处望指正! 要开发一款驱动小助手&…

vue封装基础input组件(添加防抖功能)

先看一下效果&#xff1a; // 调用页面 <template><div><!-- v-model&#xff1a;伪双向绑定 --><my-input v-model"inputVal" label"姓名" type"textarea" /></div> </template><script> import…

第3章 【例题】(完整版)

目录 前言 【例3.1】有关成绩结构体的例子 【例3.2】使用Score类的完整程序 【例 3.3】一个存在错误的程序 【例3.4】用对象赋值语句的例子 【例3.5】为类Score定义一个构造函数 【例3.6】建立对象的同时&#xff0c;用构造函数给数据成员赋初值 【例3.7】用成员初始…

ps -ef | grep 命令详解

ps 命令的作用是显示进程信息的&#xff1b; | 符号&#xff0c;是个管道符号&#xff0c;表示ps 和 grep 命令同时执行&#xff1b; grep 命令是查找&#xff08;Global Regular Expression Print&#xff09;&#xff0c;能使用正则表达式搜索文本&#xff0c;然后把匹配的…

Python实现pytest的参数化功能,使得可以在多组输入参数下运行同一个测试函数。

在pytest中&#xff0c;可以使用pytest.mark.parametrize装饰器来实现参数化功能。以下是一个示例代码&#xff1a; import pytest# 定义测试函数 def add(x, y):return x y# 使用pytest.mark.parametrize装饰器指定参数化的参数 pytest.mark.parametrize("x, y, expect…

VUE3-响应式

VUE3-响应式 响应式简介为什么使用Proxy图解实现流程DEMO实现讲解DEMO-reactiveDEMO-baseHandlerDEMO-EffectDEMO-Ref响应式简介 Vue 3引入了新的响应式系统。这个新的响应式系统使用了 ES6 的 Proxy 和 Reflect 的新特性,相对于 Vue 2.x 使用的 Observer 和 Watcher,提供了更…

Vue3如何实现组件之间的数据传递

一&#xff0c;props props可以实现父子组件通信,在vue3中我们可以通过defineProps获取父组件传递的数据。且在组件内部不需要引入defineProps方法可以直接使用&#xff01; 父组件给子组件传递数据 <Child info"我爱祖国" :money"money"></Chi…

【Spark精讲】Spark on Hive性能优化

目录 第一章 1.1 集群配置概述 1.2 集群规划概述 第二章 Yarn配置 2.1 Yarn配置说明 yarn.nodemanager.resource.memory-mb yarn.nodemanager.resource.cpu-vcores yarn.scheduler.maximum-allocation-mb yarn.scheduler.minimum-allocation-mb 第三章 Spark的配置说…

Vue3中配置env环境变量

什么时候会用到这个呢&#xff0c;比如我们的后端开发有多名&#xff0c;很多时候需要切换调用不同人的接口地址&#xff0c;或者在打包的时候&#xff0c;需要指定环境中的后台接口地址&#xff0c;那么我们频繁修改代码&#xff0c;就很麻烦&#xff0c;这个时候&#xff0c;…

burpsuite模块介绍之项目选项

使用该模块中的功能实现对token的爆破 靶场搭建:phpstudy的安装与靶场搭建 - junlin623 - 博客园 (cnblogs.com) 实现 1)先抓个包 2)设置宏 要实现我们爆破的时候请求的token也跟靶场一样一次一换从而实现爆破,那就需要用到项目选项中的宏(预编译功能)

MathType2024MAC苹果电脑版本下载安装图文教程

在数学和科学的世界里&#xff0c;表达精确的方程式和化学公式是至关重要的。MathType作为一款及其优秀且有全球影响力的数学公式编辑器&#xff0c;让这一切变得触手可及。MathType Mac版已全新升级&#xff0c;作为Microsoft Word和PowerPoint的Add-In插件&#xff0c;为您的…

Matlab定义函数计算斐波那契数列

以下是使用 MATLAB 定义函数计算并输出斐波那契数列前 200 个数的示例代码&#xff1a; function result fibonacci(n)if n < 1 || n > 200result NaN;elseif n 1 || n 2result 1;elseresult fibonacci(n-1) fibonacci(n-2);end endn 200; result fibonacci(n)…

Js的String的replace(和replaceAll(

EcmaJavascriptJs的String的 replace( 和 replaceAll( 方法 String.prototype.replaceString.prototype.replaceAll 相同点 都是String.prototype的函数都是用于字符串替换都是两个参数第一个参数都可以是正则或字符串第二参数都可以是字符串或者回调函数, 回调会传入一个参…

如何选择合适的语音呼叫中心?

市场上不同的语音呼叫中心提供商&#xff0c;都有其独特的优势和不足。企业在选择语音呼叫中心服务公司时&#xff0c;主要考虑以下因素&#xff1a;服务质量、价格、技术支持、客户支持等。 首先&#xff0c;服务质量是选择语音呼叫中心需关注的最重要因素之一。 为确保语音…

Flink CEP完全指南:捕获数据的灵魂,构建智慧监控与实时分析大师级工具

Flink CEP(Complex Event Processing)是 Apache Flink 的一个库,用于实现复杂的事件流处理和模式匹配。它可以用来识别事件流中的复杂模式和序列,这对于需要在实时数据流中进行模式识别的应用场景非常有用,比如监控、异常检测、业务流程管理等。 在Flink CEP中,你可以定…

哈希查找【数据结构】

DS哈希查找—线性探测再散列 题目描述 定义哈希函数为H(key) key%11&#xff0c;输入表长&#xff08;大于、等于11&#xff09;。输入关键字集合&#xff0c;用线性探测再散列构建哈希表&#xff0c;并查找给定关键字。 输入 测试次数t 每组测试数据为&#xff1a; 哈希表长…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查看f…

C/C++汇编学习(四)——编写不同的C++程序并分析其汇编输出

我们可以从一个简单的C代码示例开始&#xff0c;然后生成其对应的汇编代码并进行解析。这个过程不仅展示了C代码如何被转换成汇编语言&#xff0c;而且还帮助理解编译器是如何处理代码的。 案例一 C 代码示例 让我们使用一个简单的C代码示例&#xff1a;一个计算两个数之和的…

Linux 命令汇总

Linux 命令 1.查找命令 find /home/gitlab-runner/videofusionbe/api/logs/ -name ‘04-08.log’ -print 2.更换用户命令 Sudo - gitlab-runner 3.使用停止现有项目 sh rsbc.sh stop 4.启动现有项目 sh rsbc.sh start 5.启动日志 tail -f Web.log.2022-04-21.log 6.…

【Java项目】实战CRUD的功能整理(持续更新)

目录 前言1. MybatisPlus功能2. Excel处理3. 其他 前言 在实战中学习&#xff0c;整理每个功能细节以及各个函数的使用 对于Java的细节可看我之前的专栏&#xff1a;Java专栏 1. MybatisPlus功能 完整的CRUD可看我之前的文章&#xff1a; Springboot整合MybatisPlus的基本…