二进制编码

前言

我们都知道,一个程序是=数据结构+算法,如果对应到组成原理或者是硬件层面上来说,算法就是我们的各种计算机指令,而数据结构就是我们对应的二进制数据

字符串的表示,从编码到数字

其实不仅数字可以用字符串来表示,最典型的例子就是字符串,最早的使用的为英文字符串,加上数字和一些特殊的符号,之后使用8位的二进制,就能表示我们所有的字符了,这个其实就是我们经常说的ASCII码了在这里插入图片描述
ascii就好比一个字典,它可以表示不同的数,之后在我们的字符中,数字1也不再是1了。而是31了,如果是两个数字的话则就是两个连续的二进制数字放在一起,11和5就是0011 0001和0011 0101,需要两个八位来表示

我们知道,最大的32位整数,就是2147483647,如果使用整数法表示的话,只需要32位就可以表示了,而使用字符串来表示的话则需要80位来表示,这也就是才json和csv传输的,不管是整数也好,浮点数也好,采用二进制编码都会节省不少空间

但是ascii码只表示了128个字符,但是随着不同国家对计算机普及,128就不够用了,而且对于中文这样的文字来说是无法表示的,于是各国的计算机工程师就开始各显神通,给自己国家的语言创建了字符集字符编码

而字符编码则是对于字符集里的这些字符,怎么一一用二进制表示出来的一个字典。我们上面说的 Unicode,就可以用 UTF-8、UTF-16,乃至 UTF-32 来进行编码,存储成二进制。所以,有了 Unicode,其实我们可以用不止 UTF-8 一种编码形式,我们也可以自己发明一套 GT-32 编码,比如就叫作 Geek Time 32 好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。
在这里插入图片描述
字符集就是一个字符的集合,就和我们经常使用的新华字典一样,我们日常所说的Unicode,就是一个字符集,包含了150种语言的14万个不同字符,而字符编码中则是对字符集的这些字符,怎么一一用二进制表示出来一个字典,我们可以使用utf-8来进行编码。我们也可以自己发明一套 GT-32 编码,比如就叫作 Geek Time 32 好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。

所以同样的文本用不同的编码储存下来,另一个程序用不同的方式来解码,就会出现乱码,中文世界里,最典型的就是“手持两把锟斤拷,口中疾呼烫烫烫”的典故。

曾经听说过这么一个笑话,没有经验的同学,在看到程序输出“烫烫烫”的时候,以为是程序让 CPU 过热发出报警,于是尝试给 CPU 降频来解决问题。

这个是一个我们经常遇见的情况
在这里插入图片描述
首先“锟斤拷”是出现在一些老的邮件当中,他们在unicode不存在,所以就会默认为U+FFFD,用utf8记录下来则是就是\xef\xbf\xbd。如果连续两个这样的字符放在一起,\xef\xbf\xbd\xef\xbf\xbd,这个时候,如果程序把这个字符,用 GB2312 的方式进行 decode,就会变成“锟斤拷”。这就好比我们用 GB2312 这本密码本,去解密别人用 UTF-8 加密的信息,自然没办法读出有用的信息。

而“烫烫烫”,则是因为如果你用了 Visual Studio 的调试器,默认使用 MBCS 字符集。“烫”在里面是由 0xCCCC 来表示的,而 0xCC 又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,电脑就开始大叫“烫烫烫”了。

总结

到这里,相信你发现,我们可以用二进制编码的方式,表示任意的信息。只要建立起字符集和字符编码,并且得到大家的认同,我们就可以在计算机里面表示这样的信息了。所以说,如果你有心,要发明一门自己的克林贡语并不是什么难事。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值