字符编码/解码及相关概念

字符编码的相关概念:

什么是字符编码?

首先,需要清楚一个概念,即所有的字符串都是以0101的二进制的形式存储在内存或硬盘中的,因为计算机只能处理这种二进制的形式。

但是这种二进制的形式人是无法读取的,单纯的给你一段0101,你根本无法知道这个0101代表的是什么意思。

因为人类无发解读这种二进制的数据,所以,对于字符人类创建了字符编码,将人类人类可读的数据与二进制数据关联起来,所以可以说,字符编码在计算机中:是一种用来将人类可以理解的字符和计算机可以处理的二进制数据进行关联的集合。

举个例子:字每“a”,当我输入一个小写的“a”的时候,这个“a”是怎么保存在计算机中的呢?先要选择一种编码类型,假如保存“a”采用的是ASCII编码,则个根据ASCII的人为定义,“a”在对应为“01100001”,所以保存“a”是计算机保存了“01100001”

什么是编码、解码?

编码 将字符转换为二进制 即 “a”--> “01100001”

解码 将二进制转换为字符 即 “01100001”--> “a”

为什么会出现乱码,即编码错误?

继续上一章中的例子,如果需要把“a”传输给另一台计算机,只要将“01100001”传输给另一台计算机,并且要告诉,与另一台计算机约定好这段“01100001”是一个字符,并且需要使用ASCII编码,才能正确的还原为原来的字符。

如果收到信息的计算机,收到了数据,并且知道这一段数据是字符,并且是ASCII编码,那它就能正确的吧字符“a”给还原出来。但是如果计算机不知道这段数据是使用ASCII进行编码的,从而在解码是使用了其他的解码方式,那他就不能正确的将“01100001”对应转换为“a”了,因为采用了其他的编码方式的话,“a”会有其他的对应的二进制表示,而“01100001”也可能对应的其他的字符。所以收到信息的计算机会将“01100001”转换为其他的字符,而这个字符并不是原来想要的字符,那么就会出现乱码了。

为什么中文经常出现乱码,而英文很少?

因为很多不同的编码类型,如utf-8、GB2321等都是与ASCII兼容的,所以上例中的“01100001”以utf-8、GB2321、ASCII都会表示成“a”,所有的英文字母都可以有这种特性,所以它们得容错性更好,也就较难出现乱码。

对于中文,不同的编码格式是不相通的,如果使用的utf-8编码将汉字转换为二进制保存在硬盘上,在解码这些二进制数据是就一定要使用utf-8解码,否则就无法正确解读也就会出现乱码,所以相对于英文容错性小的多,也就容易出现乱码。

二进制与十六进制:

有时候,我们想直接查看某一个字符是以怎样的二进制保存在计算机中的,也就是直接读取01010100......,但是直接读取二进制太累了,容易看花眼,有没有更简单的方法的,那就是十六进制了。

每一个十六进制,都可以转换为一个四位的二进制,从十六进制的0即0x0对应二进制0000,到0xf对应二进制1111,所有十六进制数字都可以全部且唯一对应一个四位二进制,这样每一位二进制数据便可以对应成两个十六进制字符表示。

为什么使用十六进制而不是常用的十进制表示二进制?

如果采用十进制的话,01100001对应10进制的99,01100001对应十进制的100。所以如果使用十进制表示二进制则有时是2位数,有时是3位数,位数不确定,很麻烦。十六进制没有这个问题,所以一般都是使用十六进制来表示底层的二进制,使底层的二进制更可读。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值