常见几种编码格式及比较

ASCII码

ASCII是最常见,也是听到最多的,它总共有128个,用一个字节的低7位表示,0-31是控制字符如换行、回车删除等;32~126是打印字符,可以通过键盘输入并且能够显示出来,总共128符号(其中包括32个打印不出来的控制符号),只占用后7位,最前一位统一规定为0。

其中常用到的有:

字符十进制
A65
Z90
a97
z122
048

GB2312

它的全程是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是A1-F7,其中从A1-A9是符号区,总共包含682个字符,从B0-F7是汉字区,包含6763个汉字。

GBK

全称《汉字内码扩展规范》,是国家技术监督局为windows95所制定的新的汉字内码规范,它的出现是为了扩展GB2312,它相比较GB2312,主要是存的汉字更多总共有23940个码位,能表示21003个汉字,两者之间可以兼容。也就是说GB2312编码的汉字可以用GBK解码,不会出现乱码。
GBK就是在保存你的帖子的时候,一个汉字占用两个字节。。外国人看会出现乱码,此为我中华为自己汉字编码而形成之解决方案。

编码规则

GBK的中文编码是双字节来表示的,英文编码是用ASC||码表示的,既用单字节表示。但GBK编码表中也有英文字符的双字节表示形式。为区分中文,将其最高位都定成1。英文单字节最高位都为0。当用GBK解码时,若高字节最高位为0,则用ASC||码表解码;若高字节最高位为1,则用GBK编码表解码。总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

Unicode(统一码、万国码)

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。Unicode属于字符集,不属于编码,UTF-8、UTF-16等是针对Unicode字符集的编码

UTF-8

UTF-8是以字节单位对Unicode编码,第0-127位字符使用1个字节来表示(单个字母、数字符号等)和ASCII编码相同,其中大部分汉字采用三个字节编码。从128号之后开始根据字符选择要使用的字节位数。因此UTF-8被称为可变长编码。
UTF8就是在保存你的帖子的时候,一个汉字占用3个字节。。但是外国人看的话不会乱码,此为西人为了解决多字节字符而形成之解决方案。

编码规则:

如果一个字节,以11开头,连续的1的个数暗示这个字符的字节数,例如110x x x x x代表它是双字节UTF-8字符的首字节

十进制UnicodeUTF-8
0-1270x000000-0x00007F0xxxxxxx(7位)
128-2047位0x000080-0x0007FF110xxxxx 10xxxxxx(11位)
2048-65535位0x000800-0x00FFFF1110xxxx 10xxxxxx 10xxxxxx(16位)
65536-1114111位0x010000-0x10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(21位)

比如“严”的Unicode是4E25,对应二进制(100111000100101),根据上表,符合第三行格式“1110xxxx 10xxxxxx 10xxxxx”从最后一位二进制开始,依次从后向前填入格式中的x,多出来的补0;严的UTF-8编码为”11100100 10111000 10100101“转为十六进制就是E4B8A5.

UTF-16

UTF-16编码以16位无符号整数为单位,使用二或四个字节为每个字符编码,其中大部分汉字采用两个字节编码。

编码规则
十进制UnicodeUTF-16
0-65535位0x00000-0x00FFFFxxxxxxxx xxxxxxxx(16位)
65536-1114111位0x010000-0x10FFFF110110yy yyyyyyyy 110111xx xxxxxxxx(20位)

与UTF-8相比虽然表示的方法简单方便,有很大一部分字符用一个字节就可以表示的现在要用两个字节表示,有占有的存储空间放大一倍,会增大网络传输的流量,而且没必要这么做。

UTF-32

UTF-32编码以32位无符号整数为单位。

编码规则
十进制UNicodeUTF-32字节流
0-111411位0x000000-0x10FFFFFxxxxxxxx xxxxxxxx xxxxxxx xxxxxxxx(32位)

UTF-32与UTF-16一样有小尾序和大尾序之别,编码前会放置FEFF或FFFE区分

字节序

字节序有两种,分别是大端(Big Endian,BE)和小端(Little Endian,LE)。Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。
UTF-8虽是字节顺序无关的,但仍然可以用BOM来表明其编码方式。PHP并不会忽略UTF-8的BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。因此PHP文件采用UTF-8编码时可保存无BOM格式

UTF编码BOM
UTF-8 without BOM
UTF-8 with BOMEE BB BF
UTF-16LEFF FE
UTF-16BEFE FF
UTF-32LEFF FE 00 00
UTF-32BE00 00 FE EE

这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

几种编码格式的比较

对于中文字符GB2312与GBK编码规则类似,但GBK的范围更大,它能处理所有汉字字符,所以GB2312与GBK比较选择GBK。UTF-8和UTF-16都是处理Unicode编码,UTF-16编码效率最高,字符到字符相互转换更简单,进行字符串操作也更好。它适合在本地磁盘和内存之间使用,可以进行字符与子节之间快速切换如java的内存编码就是采用UTF-16编码,但不适合在网络之间传输,因为网络传输容易损坏字节流,一旦字节流损坏将很难恢复,相比而言UTF-8更适合网络传输。UTF-8在编码效率和编码安全性上做了平衡,是最理想的中文编码方式。GBK包含全部中文字符,UTF-8则包含全世界所有国家需要用到的字符。UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。比如,如果是UTF-8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。但是如果UTF8中出现中文那就是3个字节~~具体的自己权衡。

参考资料:
https://blog.csdn.net/Hknock/article/details/75498427
https://blog.csdn.net/jkx1132/article/details/76900852
https://blog.csdn.net/qq_37859539/article/details/79857476

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值