【单片机笔记】关于字符编码,UTF-8、GBK、UTF8、GB2312之间的区别和关系

【单⽚机笔记】关于字符编码,UTF-8、GBK、UTF8、
南社GB2312之间的区别和关系
辣妹掌门人下载UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是⽤以解决国际上字符的⼀种多字节,它对英⽂使⽤8位(即⼀个字节),中⽂使⽤24为(三个字节)来编码。UTF-8包含全世界所有国家需要⽤到的字符,是国际编码,通⽤性强。UTF-8编码的⽂字可以在各国⽀持UTF8字符集的浏览器上显⽰。如,如果是UTF8编码,则在外国⼈的英⽂IE上也能显⽰中⽂,他们⽆需下载IE的中⽂语⾔⽀持包。
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的⽂字编码是⽤双字节来表⽰的,即不论中、英⽂字符均使⽤双字节来表⽰,为了区分中⽂,将其最⾼位都设定成1。GBK包含全部中⽂字符,是国家编码,通⽤性⽐UTF8差,不过UTF8占⽤的数据库⽐GBK ⼤。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
简单从功能上说:
1、GBK通常指GB2312编码 只⽀持简体中⽂字
时间统计法2、utf通常指UTF-8,⽀持简体中⽂字、繁体中⽂字、英⽂、⽇⽂、韩⽂等语⾔(⽀持⽂字更⼴)
3、通常国内使⽤utf-8和gb2312,看⾃⼰需求选择
1、字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使⽤的缺省编码⽅式就是计算机的内码。早期的计算机使⽤7位的ASCII编码,为了处理汉字,程序员设计了⽤于简体中⽂的GB2312和⽤于繁体中⽂的big5。
图形用户界面GB2312(1980年)⼀共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围⾼字节从B0-F7,低字节从A1-FE,占⽤的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312⽀持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
从ASCII、GB2312到GBK,这些编码⽅法是向下兼容的,即同⼀个字符在这些⽅案中总是有相同的编码,后⾯的标准⽀持更多的字符。在这些编码中,英⽂和中⽂可以统⼀地处理。区分中⽂编码的⽅法是⾼字节的最⾼位不为0。按照程序员的称呼GB2312、GBK都属于双字节字符集 (DBCS)。
2、Unicode、UCS和UTF
Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,⽽GB码是BABA。
Unicode也是⼀种字符编码⽅法,不过它是由国际组织设计,可以容纳全世界所有语⾔⽂字的编码⽅案。Unicode的学名是"UniversalMultiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写。
3、UCS-2、UCS-红外线视频
4、BMP
UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是⽤两个字节编码,UCS-4就是⽤4个字节(实际上只⽤了31位,最⾼位必须为0)编码。
4、UTF编码
UTF-8就是以8位为单元对UCS进⾏编码。从UCS-2到UTF-8的编码⽅式如下:
UCS-2编码(16进制) UTF-8 字节流(⼆进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要⽤3字节模板了:1110xxxx 10xxxxxx10xxxxxx。将
6C49写成⼆进制是:0110 110001 001001, ⽤这个⽐特流依次代替模板中的x,得到:1110011010110001 10001001,即E6 B1 89。
UTF-16以16位为单元对UCS进⾏编码。对于⼩于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位⽆符号整数。对于不⼩于0x10000的UCS码,定义了⼀个算法。不过由于实际使⽤的UCS2,或者UCS4的BMP必然⼩于0x10000,所以就⽬前⽽⾔,可以认为UTF-16和UCS-2基本相同。但UCS-2只是⼀个编码⽅案,UTF-16却要⽤于实际的传输,所以就不得不考虑字节序的问题。
5、UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释⼀个UTF-16
⽂本前,⾸先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“⼄”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这
是“奎”还是“⼄”?
Unicode规范中推荐的标记字节顺序的⽅法是BOM。BOM不是“Bill Of Material”的BOM表,⽽是Byte order Mark。BOM是⼀个有点⼩聪明的想法:
在UCS编码中有⼀个叫做"ZERO WIDTH NO-BREAKSPACE"的字符,它的编码是FEFF。⽽FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"⼜被称作BOM。
还我至尊
UTF-8不需要BOM来表明字节顺序,但可以⽤BOM来表明编码⽅式。字符"ZERO WIDTH NO-BREAKSPACE"的UTF-8编码是EF BB BF(读者可以⽤我们前⾯介绍的编码⽅法验证⼀下)。所以如果接收者收到以EF BBBF开头的字节流,就知道这是UTF-8编码了。
By Urien 2019年8⽉17⽇ 13:33:15

本文发布于:2024-09-20 21:25:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/63426.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字节   编码   字符   传输   单元   计算机   内码   规范
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议