面试官问你编码相关的面试题,把这篇甩给他就完事!

前情回顾:Java中一个字符占两字节 但为何new String("字").getBytes().length 返回3个字节html

今天主要聊一聊:java

  • 字节
  • 字符
  • 字符集
  • 编码
  • 字符编码
  • Java 内码和外码
  • Unicode

字节

例如 :00001111 这个8位二进制数就占了一个字节的存储容量。程序员

字节(英语:Byte),一般用做计算机信息计量单位,不分数据类型。 一个字节表明八个比特(英语:Bit)。这个是最基本的概念了,字节是计算存储容量的一种计量单位,计算机只能识别1和0组成的二进制位。一个数就是1位(bit),为了方便计算,咱们规定8位就是一个字节。面试

例如 :00001111 这个8位二进制数就占了一个字节的存储容量。编程

字符

字符和字节不太同样,任何一个文字或符号都是一个字符,但所占字节不必定,不一样的编码致使一个字符所占的内存不一样。字符是各类文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 也就是说,一个数字是一个字符,一个文字是一个字符,一个标点符号也是一个字符。windows

1 是 字符,“汉” 是字符,“!”感叹号是字符。微信

字符集

  charset 是 character set 的简写,即字符集。字符的集合就叫字符集。ASCII字符集就是下表中的字符那一列的全部字符的集合jvm

编码

编码是一个很是宽泛的概念!虽然咱们一直用编码特指字符集编码,但这只是一种狭义的理解,广义的理解则有不少:编码

  • 文字是对声音的编码
  • 照相机,摄像机把光信号编码成图像及视频
  • 咱们还常常能看到条形码,二维码,这些都是编码

著名的摩尔斯电码其实也是一种编码:.net

image

在图片中,M的编码就是“━ ━”,其它相似。

字符编码 是 编码的一种状况,不过咱们学计算机的说到编码就是字符编码。

字符编码

encoding 是 charset encoding 的简写,即字符集编码,简称编码。定义字符集中的字符如何编码为特定的二进制数,以便在计算机中存储(就是将字符在字符集中的对应位置化为二进制)。

字符集和字符编码通常一 一对应,Unicode字符集例外,由于Unicode字符集有三种编码方式(utf-8,utf-16,utf-32)

字符编码 和 字符集的区别

与接口及接口实现的对比

能够把这二者与接口接口实现作个对比:

image.png

从这里能够很清楚地看到,

  1. 编码是依赖于字符集的,就像代码中的接口实现依赖于接口同样;
  2. 一个字符集能够有多个编码实现,就像一个接口能够有多个实现类同样。

Java中 内码和外码

简单来讲

  • 内码:char或String在内存里使用的编码方式。
  • 外码:除了内码均可以认为是“外码”。(包括class文件的编码)

java内码:unicode(utf-16)

jvm默认外码:

  • windows——gbk
  • Linux——utf-8

为何Unicode这么特殊?

人们弄出新的字符集标准,驱动力无外乎是旧的字符集里的字符不够用了。

Unicode 的目标是统一全部的字符集,囊括全部的字符,粗略估算为 17×6万=102 万,因此字符集发展到它这里就到头了,再去整什么新的字符集就不必也不该该了,102万目前已经彻底够用了。

但若是以为它现有的编码方案不太好呢?在不能弄出新的字符集状况下,只能在编码方面作文章了,因而就有了多个实现,这样一来传统的一一对应关系就打破了。

好比说UTF-32编码,哪怕是00000000 00000000 00000000 00001111这种其实只占了1个字节的字符,咱们也要为他分配4个字节的空间,这就致使一个能够用1G保存的文件,如今须要4G才能保存,这是极其浪费的作法。

因而某位大牛以为UTF-32编码太浪费空间了吧,因而大牛就作出了UTF-八、UTF-16编码方案(这里就是举个例子,可能大牛就是搞出来玩,具体缘由无从考究)

浅谈Unicode

参考

本文首发于微信公众号:程序员乔戈里

若是是头条用户,能够在个人头条号程序员乔戈里后台回复 资源获取价值59998元的编程和考研资料 以为文章不错的欢迎关注个人WX公众号:程序员乔戈里
我是BAT大厂后台开发工程师,,专一分享技术干货/编程资源/求职面试/成长感悟等,关注送5000G编程资源和本身整理的一份帮助很多人拿下java的offer的面经附答案,免费下载CSDN资源。

本文由博客一文多发平台 OpenWrite 发布!

相关文章
相关标签/搜索