文档章节

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

gzc426
 gzc426
发布于 2019/12/16 00:08
字数 1440
阅读 23
收藏 0

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

今天主要聊一聊:

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

字节

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

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

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

字符

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

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

字符集

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

编码

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

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

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

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-8、UTF-16编码方案(这里就是举个例子,可能大牛就是搞出来玩,具体原因无从考究)

浅谈Unicode

参考

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

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

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

© 著作权归作者所有

gzc426
粉丝 0
博文 53
码字总数 91123
作品 0
哈尔滨
私信 提问
参加阿里这类大公司的社招该如何准备?

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来。LZ自己当初面试完以后,除了记住一些聊过的知识...

kangbin825
2017/04/03
0
0
阿里社招面试应该如何准备才能事半功倍呢?

  我会分为四个部分来谈论这个问题,由于LZ本身是Java出身,因此关于主语言的问题,都是与Java相关,其它语言的同学可以选择性忽略。此外,面试的时候一般面试官的问题都是环环相扣,逐渐深...

Java高级进阶架构师
2018/07/19
0
0
阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来。LZ自己当初面试完以后,除了记住一些聊过的知识...

火力全開
2016/10/23
56
0
阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来。LZ自己当初面试完以后,除了记住一些聊过的知识...

Lunaqi
2018/01/08
0
0
我从阿里面试回来,想和Java程序猿谈一谈

点击上方“程序员大咖”,选择“置顶公众号” 关键时刻,第一时间送达! 最近小编看了一篇关于面试的文章,题目是“我从阿里面试回来,想和Java程序员谈一谈”,内容不是讲面试前刷题,而是更...

px01ih8
2017/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C#如何创建Guid值?

我们结构的一个字段是Guid类型。 如何为它生成有效值? #1楼 System.Guid desiredGuid = System.Guid.NewGuid(); #2楼 Guid id = Guid.NewGuid(); #3楼 Guid.NewGuid()创建一个新的随机gui...

技术盛宴
18分钟前
33
0
将idea中的springboot项目部署到远程的docker容器

1、在idea中创建项目,如下图 2、配置docker maven plugin <!-- Docker maven plugin --><plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</arti......

Lion华
31分钟前
59
0
在C中,i ++和++ i之间是否存在性能差异?

如果不使用结果值, i++和++i之间会有性能差异吗? #1楼 请不要让“哪个更快”的问题成为使用哪个的决定因素。 您永远都不会在乎那么多,此外,程序员的阅读时间比机器学习的时间要昂贵得多。...

javail
34分钟前
46
0
Android MVP 快速开发框架ZBLibrary

MVP 架构,提供一套开发标准(View,Data,Event)以及模板和工具类并规范代码。封装层级少,简单高效兼容性好。 OKHttp、UIL图片加载、ZXing二维码、沉浸状态栏、下载安装、自动缓存以及各种B...

boonya
43分钟前
35
0
为BlueLake主题增加图片放大效果

fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大、相册浏览、视频弹出层播放等效果。优点有使用简单,支持高度自定义,兼顾触屏、响应式移动端特性,总之使用体验相当好...

CREATE_17
50分钟前
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部