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

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

✔️ 解析

就像电报只能发出 "滴" 和 "答" 声一样,计算机只认识 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进行解码,得到的内容就会是"银届萦银斤拷霍位银斤拷直银斤拷馄",这就是乱码。

相关推荐
轻口味17 分钟前
命名空间与模块化概述
开发语言·前端·javascript
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
晓纪同学1 小时前
QT-简单视觉框架代码
开发语言·qt
威桑1 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
Hello.Reader1 小时前
深入解析 Apache APISIX
java·apache
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans1 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#