字符集和编码

乱码是我们日常开发中经常遇到的问题,而且每次感觉都很棘手,所以很有必要来深入分析一下这个问题。

首先,什么是字符集和编码。

字符集,可以看作是字符的一种映射。比如Unicode的映射目标就是一种数字,叫做码点(code point)。除了Unicode还有其他一些字符集,比如我国的GBK,GB2312,GB18030, 欧洲的ISO-8859-1等,这些字符集的区别不是本文的重点,只要清楚字符集到底是什么就够了。

编码,就是将字符按照某种映射关系转化为二进制信息。主要有两种实现方式,定长和变长。

对于定长方式,优点是实现起来比较简单,直接将字符在字符集中的映射目标转化为二进制,然后解码每次取固定的位数来解析。但是这样有一个缺点就是,空间浪费太大。比如,如果采用固定编码,每个字符对应4字节,但是某个文件内部基本上都是英文字母字符,有效空间仅占原文件空间的1/4。GBK编码就是以定长方式实现的,固定为16位。

所以为了解决这个问题就产生了变长方式,日常生活中很常见的UTF-8、UTF-16就是根据Unicode来进行变长编码,UTF-8和UTF-16的区别在于最低不等,UTF-8是以8字节开始的,UTF-16是以两个字节开始的,然后都往后面扩展。采用变长编码也有一个问题,就是在解码的时候到底是取一个字节来解析还是取两个字节呢?这个问题的解决方式是在编码信息中插入一些控制信息,然后解码就根据这些控制信息来取字节,然后剔除控制信息,即可得到原信息。注意:UTF-32采用固定的4个字节进行编码,是一种定长方式。

在将UTF-8或UTF-16进行转换到其他编码时(比如GBK),首先是转化为Unicode,因为要剔除一些控制信息。

经过以上的分析,可以得知乱码是怎么产生的了,是编码的规则和解码的规则不一致导致的,别小看这个问题,也别以为只是会产生乱码这么简单,有时还会产生内存越界等。恢复编码的方法就是在改变当前解码的规则,使其与编码规则相符即可。

很多时候某个字符集是另一个字符集的扩展,所以转化为仍然不会出现问题,但是很多时候结果都是会出现乱码的。

其实文本文件也是二进制文件,只是字符集给了我们错觉。很多特殊文件都对应着不同的解析方式,比如在打开.docx文件时,word软件就会执行大量的解析操作,同样的,用Sublime打开txt,也会根据编码规则来解析。请注意,文件的后缀名并不影响文件的解析和存储,后缀名纯粹是为了用户方便。另外,Windows上默认是以GBK编码的,而Linux默认是以UTF-8编码的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值