字符编码杂谈

引言

作为一个程序员,遇见文本乱码的事情并不少见,而要想解决乱码的问题,其实关键是要知道文件的编码方式,不妨脑补一下字符编码的知识,从网上到处收集资料,发现关于字符编码的知识还是蛮深的,正文从一些起源开始讲述,希望大家能有个了解。

ASCII码

大家都知道计算机存储任何信息,底层统一采用二进制表示,通常说的一字节即8bit,1bit要么代表0,要么代表1,而处理通常以字节为单位来处理,那么一字节8位就可以组合出256种状态。上世纪60年代,美国人依据这指定了一套字符编码方案,对他们的英文字母和常用符号做了与二进制的对应,这被称为ASCII码,一直沿用至今。ASCII码一共规定了128个字符的编码,比如空格”SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0,或用于通讯安全作奇偶校验。

混乱期

128个符号编码对于英语是够用了,但是对于其他国家却不够用,于是一些欧洲国家决定用字节闲置的最高位,这样就可以扩充到256个字符,前面沿用ASCII码,对于文字符号不算多的国家,还是够用的,就算如此,不同国家扩充方式不同,前面虽然ASCII码兼容,但是后面编码却冲突,也就是128-256这区间,同一数字却表示不同字符,如俄语,法语,希伯来语沿用单字节的扩充冲突。而对于一些亚洲国家的文字就更丰富了,典型的中日韩,而汉语就高达数十万,于是中国就出现了简体中文gb2312编码,采用双字节,可以表示256x256,即65536种字符。

unicode

正如开头所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。当然需要注意的是Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

utf-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有二条:1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值