写点什么

烫烫屯屯锟斤拷��

  • 2022 年 5 月 24 日
  • 本文字数:3968 字

    阅读完需:约 13 分钟

▊你可能看到过国内超市售卖 22 元一盒的“锟斤拷”!?



▊就连国外也有出售过的“屯屯屯”!?



▊电脑出现“烫烫烫”的时候难道是 CPU 发热的自救信号?



其实上面这些都是乱码。

但是这些乱码都是怎么来的?我们要从计算机的编码方式讲起。

什么是 ASCII 和 Unicode

1. 字符编码和 ASCII

电报在传递的过程中,需要发报员用电键发出长短不一的电码,收报员听到的是电报机发出的滴滴答答的声音。其实电报发出的声音都是“滴”和“答”的组合,“答”的声音是“滴”的三倍长。

发报员要先通过一种方式,将想要发送的情报转成电报的滴答声,收报员在听到滴答声之后,再将它们翻译成正常的文字。这个过程就是字符编码和字符解码。

谍战剧中将情报转成电报的“滴”声和“答”声主要通过摩尔斯电码实现的,这是一种通过不同的排列顺序来表达不同的英文字母、数字和标点符号的字符编码方式。



摩尔斯电码由短的和长的电脉冲(称为点和划)组成。点和划的时间长度都有规定,以一点为一个基本单位,一划等于三个点的长度,正好对应电报的“滴”和“答”。国际摩尔斯电码如下图所示。



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

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

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

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套计算机编码系统。它主要用于显示现代英语,其中共有 128 个字符。

标准 ASCII 码也叫作基础 ASCII 码,使用 7 位二进制数( 剩下的 1 位二进制数为 0)来表示所有的大写和小写字母、数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。

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

在介绍其他的字符编码之前,我们先来说一下一个计算机领域通用的字符集。


2.Unicode

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

Unicode 至今仍在不断增修,每个新版本都加入了更多新的字符。目前最新的版本为 2019 年 5 月公布的 v12.1,这一版本只新增了一个字符,即日本新年号的合字(上令下和)。

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

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


有了 Unicode 为什么还需要 UTF-8

nicode 虽然统一了全世界字符的编码,但没有规定如何存储。这么做有如下考虑:

如果 Unicode 统一规定,那么每个符号要用三个或四个字节表示,因为字符太多,所以只能用这么多字节才能表示完全。

一旦这么规定,那么每个英文字母前都必然有 2~3 字节是 0,因为所有英文字母在 ASCII 码中都有,都可以用一个字节表示,剩余字节位置就要补充 0。

如果这样,那么文本文件的大小会因此大出二三倍,这对于存储来说是极大的浪费。为了解决这个问题,就出现了一些中间格式的字符集,它们被称为通用转换格式,即 UTF(Unicode Transformation Format)。常见的 UTF 格式有 UTF-7、UTF-7.5、UTF-8、UTF-16 和 UTF-32。

● UTF-8 使用 1 ~ 4 字节为每个字符编码。

● UTF-16 使用 2 或 4 字节为每个字符编码。

● UTF-32 使用 4 字节为每个字符编码。

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

举个例子,Unicode 规定了一个中文字符“我”对应的 Unicode 编码是“\u6211”,但是,在 UTF-8 和 UTF-16 等不同的实现方式下,这个二进制 code 的存储方式是不一样的。

UTF-8 使用可变长度字节来储存 Unicode 字符,例如 ASCII 字母继续使用 1 字节储存,重音文字、希腊字母或西里尔字母等使用 2 字节来储存,而常用的汉字就要使用 3 字节,辅助平面字符则使用 4 字节。


有了 UTF-8 为什么还需要 GBK


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

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

那些晚一些纳入的字符,在 UTF-8 中的存储所占的字节数可能就会多一些,对存储空间的要求就会很大。

对于常用的汉字,在 UTF-8 中采用 3 字节进行编码,如果有一种只包含中文和 ASCII 的编码,那么就不需要使用 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 国际标准;所有字符都可以一对一映射到 Unicode 2.0 上。

◎ 缺点:不属于官方标准,很多搜索引擎都不能很好地支持 GBK 汉字。

 GB18030(2000 年):32 位字符集,收录了 27484 个汉字,同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

◎ 优点:可以收录所有可能想到的文字和符号,属于最新的国家标准。

◎ 缺点:目前支持它的软件较少。


为什么会存在乱码

我们还以前面介绍的发电报为例,假设有以下场景:

发报员使用“美式摩尔斯电码”将情报转换成电报,收报员收到电报之后,通过“现代国际摩尔斯电码”进行破译,那么得到的情报内容可能完全看不懂,这就是乱码了。


本文节选自《深入理解 Java 核心技术:写给 Java 工程师的干货笔记(基础篇)》一书,欢迎阅读本书夯实你的 Java 技术!



写了啥

本书是《Java 工程师成神之路》系列丛书的第一本,所谓"基础不牢,地动山摇",这本书就是来给大家筑基的!

之前经常有人问,到底达到一个什么样的水品,可以称之为高级工程师?会哪些东西,才能叫作 Java 技术专家?

抛开那些高大上的框架、中间件、分布式什么的理论,这里把所有作者认为一个 Java 开发者需要掌握的基础知识全部都放到这本书里面了。

全书一共有 23 个章节,比较丰富全面的覆盖到了 Java 开发者日常工作中用到的几乎所有基础知识。

《道德经》里面的一句话"有道无术,术尚可求;有术无道,则止于术",那到底什么是"道"什么是"术"呢?

在写这本书之前作者也一直在探索,但是在写完之后,把这本书全部通读一遍之后,作者豁然开悟。

原来书中提出的那些问题,那些问题背后的思考,以及思考背后的原理解析,就是作者一直所追寻的"道"。

所以,作者又改了第二版、第三版、第四版....不断地删除了原来的一些"概念"、"用法",不断地新增进去更多的"原理"和"思考",不断地尝试着通过各种通俗的语言、例子把这些道理讲清楚。



适合谁

但是,虽然作者穷尽了各种办法,想让书中的内容通俗易懂,但还是想说:这本书并不是适合所有人的。

以下几类人群不适合读这本书:

1、完全没有编程经验的人;这本书不是 cook book,不能帮你 21 天掌握 Java,并没有从安装虚拟机、配置 classpath 讲起。

2、认为代码写出来能跑就行,抵制一切"八股"的人;这本书中很多的知识点都是来源于工作中遇到的"坑"、书中分析了很多源码,是一本深入原理的书籍。一本十足的"八股"宝典。

其他人,无论是刚工作一两年的新手,还是工作了五六年的老司机;无论是准备找工作需要一本面试宝典,还是需要一本书来帮你躲避工作中的那些坑;无论是体系化学习作为知识体系,还是日常学习作为查缺补漏。

这本书,都适合你


本书特色

所谓一图胜千言,为了方便大家理解,这本书中画了很多图

为了给大家带来更好的阅读体验,这本书采取的是彩印版。全书 500 多页,全部都是彩印。



为了方便读者阅读和理解,除了前两章,本书尽量摒弃了太过枯燥的概念性描述,也避免堆砌大篇幅的代码,试图通过举例、比喻、引用等方式把 Java 体系中的很多原理知识讲解清楚。

因为 Java 体系中的很多知识点都是相关联的,所以本书在提到其他知识点时,为了方便读者进行关联性学习,会标注相关章节和内容提要。

本书更加注重对原理的解读,很多语法的概念介绍及使用方式并不是本书的重点。所以,本书中大部分内容均是 Java 开发者需要重点关注的一些知识点,很多知识点的总结均来源于日常开发中遇到的对各种线上问题的排查与总结。


怎么买

现在书籍已经在京东、当当等平台开启预售了。现在京东、当当自营的价格是 7 折的。

但是,对待自己的亲粉丝,怎么能没有专属优惠呢?


给大家申请了专享 6 折的优惠,但是是限时限量的,所以,欲购从速喽。扫描下方二维码,就可以直达优惠链接了。



长按扫码立享优惠

另外,随书附送的还有一个史无前例的小惊喜给到大家,看到之后会让你忍不住惊呼的那种!


还等啥,上车吧!



用户头像

还未添加个人签名 2019.10.21 加入

还未添加个人简介

评论

发布
暂无评论
烫烫屯屯锟斤拷��_博文视点Broadview_InfoQ写作社区