编码,解码与乱码的原理与乱码解决

在做开发中肯定经常遇到乱码这种事情,对于新手来说比较头疼,很难解决。但其实只要等你了解的知识够了之后,你就会发现太简单了,而且高手是不会碰到乱码的

首先用图来表达这个内容,若看的懂图,后面的长长的字就不用看了。
以ISO-8859-1与utf-8为例:

 

*前言
在说编解码之前,有必要提一下为什么要编码,解码。我现在所写的这些字,计算机都是不认识的,在它内部,只认识二进制0,1,在它的存储里也没有字符的说法,只有0,1。所谓的字符只是我们人类为了标识我们的世界里的事物而创造的,现在有了计算机,它运算快,我们想让它帮我们处理问题,但是他不认识字符,我们不认识0,1,于是,我们就规定(假设这样规定):一个字节表示一个字符,10000000 表示A,100000001 表示B 。。。。。。这种规定就叫编码方式(0,1组合到具体字符的映射关系)。有了刚才的规定,现在,从计算机里读到10000000 ,则文本软件就依照映射将其翻译成A显示呈现出来,反之亦然。
*正文
正如前言所讲,编码实际上就是一种一对一的映射关系。但是不同人有不同的想法,有人说10000000 是A,有人说它是X(你们随意),于是就产生很多种所谓的编码方式(GBK,UTF-8.。。。。)。不同的编码方式将同一二进制数据解释成不同的字符,正是由于大家所用的标准不同,造成相互转化时,谁也不认识谁(有一张票子,你说那是钱,一老外说是money,谁对谁错呢?有点哲学的意思,应该看具体使用场景吧),于是乱码了。所以应该保证你用什么编码存储的,就用什么编码解释它(解码)。

*坑
上面说了,打开一个文件乱码,一定是没用它编码的编码方式来解释,那我换成它的编码方式来打开就不乱了?
理论上讲是这样的。还是那上面举例的编码方式,第一种编码认为100000000 应该表示A,反之A应解释成10000000,第二种编码认为应该表示@符号。那么很明显,我想存储A,采用第一种方式 在磁盘上写下10000000,当你用第二种编码来解释时,得到@符号,此时无意义,可以认为是乱码,这时只需换回第一种编码,就能正确取得A字符。
往往都是理论上,在实际中,特别是汉字编码,很多字符编码的范围没汉字范围大,那他们怎么办呢?不认识的统统拿某一字符替换!比如上面的例子,假设第二种编码只用到了10000011-101111111这个范围来表示字符(它只认这么多)如果它读取到这个范围以外的二进制序列,它的映射关系里没有啊,那怎么办,就用自己有的某个字符替换咯,假设拿?(100011111)来表示所有不认识的序列。如你所见,乱码了。此时,只是变现层是?字符,在磁盘上还是存储的原本的二进制序列,尽管此编码不认识它,但总有一个合适的编码能正确解释它。但是当你使用这个编码按下保存键时,刚才被替换的成?的字符是不是在此时也被当成你自己输入的字符了?电脑可不管你这个字符哪儿来的,你按保存就是保存当前内容,于是?被保存了(100011111),那么也就相当于原来的字符已经在二进制数据上被?替换了。这时,你再换回原本的编码也得不到原本的“正确”字符了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值