中文字符unicode查询C语⾔:GB2312编码和GBK编码,将中⽂存储到计算机
计算机是⼀种改变世界的发明,很快就从美国传到了全球各地,得到了所有国家的认可,成为了⼀种不可替代的⼯具。计算机在⼴泛流⾏的过程中遇到的⼀个棘⼿问题就是字符编码,计算机是美国⼈发明的,它使⽤的是 ASCII 编码,只能显⽰英⽂字符,对汉语、韩语、⽇语、法语、德语等其它国家的字符⽆能为⼒。
为了让本国公民也能使⽤上计算机,各个国家(地区)也开始效仿 ASCII,开发了⾃⼰的字符编码。这些字符编码和 ASCII ⼀样,只考虑本国的语⾔⽂化,不兼容其它国家的⽂字。这样做的后果就是,⼀台计算机上必须安装多套字符编码,否则就不能正确地跨国传递数据,例如在中国编写的⽂本⽂件,拿到⽇本的电脑上就⽆法打开,或者打开后是⼀堆乱码。
下表列出了常见的字符编码:
字符编码说明
ISO/IEC 8859欧洲字符集,⽀持丹麦语、荷兰语、德语、意⼤利语、拉丁语、挪威语、葡萄⽛语、西班⽛语,瑞典语等,1987 年⾸次发布。
ASCII 编码只包含了*本的拉丁字母,没有包含欧洲很多国家所⽤到的⼀些扩展的拉丁字母,⽐如⼀些重
⾳字母,带⾳标的字母等,ISO/IEC 8859 主要是在 ASCII 的*础上增加了这些衍⽣的拉丁字母。
Shift_Jis⽇语字符集,包含了全⾓及半⾓拉丁字母、平假名、⽚假名、符号及⽇语汉字,1978 年⾸次发布。
Big5繁体中⽂字符集,1984 年发布,通⾏于台湾、⾹港等地区,收录了 13053 个中⽂字、408个普通字符以及 33 个控制字符。GB2312简体中⽂字符集,1980 年发布,共收录了 6763 个汉字,其中⼀级汉字 3755 个,⼆级汉字 3008 个;同时收录了包括拉丁字母、希腊字母、⽇⽂平假名及⽚假名字母、俄语西⾥尔字母在内的 682 个字符。
GBK 中⽂字符集,是在 GB2312 的*础上进⾏的扩展,1995 年发布。
GB2312 收录的汉字虽然覆盖了中国⼤陆 99.75% 的使⽤频率,满⾜了*本的输⼊输出要求,但是对于⼈名、古汉语等⽅⾯出现的罕⽤字(例如***的“*”就没有被 GB2312 收录),GB2312 并不能处理,所以后来⼜对 GBK 进⾏了⼀次扩展,形成了⼀种新的字符集,就是 GBK。
GBK 共收录了 21886 个汉字和图形符号,包括 GB2312 中的全部汉字、⾮汉字符号,以及 BIG5 中的全部繁体字,还有⼀些⽣僻字。
GB18030
中⽂字符集,是对 GBK 和 GB2312 的⼜⼀次扩展,2000 年发布。
GB18030 共收录 70244 个汉字,⽀持中国国内少数民族的⽂字,以及⽇语韩语中的汉字。
由于 ASCII 先⼊为主,已经使⽤了⼗来年了,现有的很多软件和⽂档都是*于 ASCII 的,所以后来的这些字符编码都是在 ASCII *础上进⾏的扩展,它们都兼容 ASCII,以⽀持既有的软件和⽂档。
兼容 ASCII 的含义是,原来 ASCII 中已经包含的字符,在国家编码(地区编码)中的位置不变(也就是编码值不变),只是在这些字符的后⾯增添了新的字符。
如何存储
标准 ASCII 编码共包含了 128 个字符,⽤⼀个字节就⾜以存储(实际上是⽤⼀个字节中较低的 7 位来存储),⽽⽇⽂、中⽂、韩⽂等包含的字符⾮常多,有成千上万个,⼀个字节肯定是不够的(⼀个字节最多存储 28 = 256 个字符),所以要进⾏扩展,⽤两个、三个甚⾄四个字节来表⽰。
在制定字符编码时还要考虑内存利⽤率的问题。我们经常使⽤的字符,其编码值⼀般都⽐较⼩,例如字母和数字都是 ASCII 编码,其编码值不会超过 127,⽤⼀个字节存储⾜以,如果硬要⽤多个字节存储,就会浪费很多内存空间。
为了达到「既能存储本国字符,⼜能节省内存」的⽬的,Shift-Jis、Big5、GB2312 等都采⽤变长的编码⽅式:对于原来的 ASCII 编码部分,⽤⼀个字节存储⾜以;
对于本国的常⽤字符(例如汉字、标点符号等),⼀般⽤两个字节存储;
对于偏远地区,或者极少使⽤的字符(例如藏⽂、蒙古⽂等),才使⽤三个甚⾄四个字节存储。
总起来说,越常⽤的字符占⽤的内存越少,越罕见的字符占⽤的内存越多。
具体讲⼀下中⽂编码⽅案
GB2312 --> GBK --> GB18030 是中⽂编码的三套⽅案,出现的时间从早到晚,收录的字符数⽬依次增加,并且向下兼容。GB2312 和 GBK 收录的字符数⽬较少,⽤ 1~2个字节存储;GB18030 收录的字符最多,⽤1、2、4 个字节存储。
1) 从整体上讲,GB2312 和 GBK 的编码⽅式⼀致,具体为:
对于 ASCII 字符,使⽤⼀个字节存储,并且该字节的最⾼位是 0,这和 ASCII 编码是⼀致的,所以说 GB2312 完全兼容 ASCII。
对于中国的字符,使⽤两个字节存储,并且规定每个字节的最⾼位都是 1。
例如对于字母A,它在内存中存储为 01000001;对于汉字中,它在内存中存储为 11010110 11010000。由于单字节和双字节的最⾼位不⼀样,所以字符处理软件很容易区分⼀个字符到底⽤了⼏个字节。
2) GB18030 为了容纳更多的字符,并且要区分两个字节和四个字节,所以修改了编码⽅案,具体为:
对于 ASCII 字符,使⽤⼀个字节存储,并且该字节的最⾼位是 0,这和 ASCII、GB2312、GBK 编码是⼀致的。
对于常⽤的中⽂字符,使⽤两个字节存储,并且规定第⼀个字节的最⾼位是 1,第⼆个字节的⾼位最多只能有⼀个连续的 0(第⼆个字节的最⾼位可以是 1 也可以是 0,但是当它是 0 时,次⾼位就不能是 0 了)。注意对⽐ GB2312 和 GBK,它们要求两个字节的最⾼位为都必须为 1。
对于罕见的字符,使⽤四个字节存储,并且规定第⼀个和第三个字节的最⾼位是 1,第⼆个和第四个字节的⾼位必须有两个连续的 0。
例如对于字母A,它在内存中存储为 01000001;对于汉字中,它在内存中存储为 11010110 11010000;对于藏⽂,它在内存中的存储为 10000001 00110010 11101111 00110000。
字符处理软件在处理⽂本时,从左往右依次扫描每个字节:
如果遇到的字节的最⾼位是 0,那么就会断定该字符只占⽤了⼀个字节;
如果遇到的字节的最⾼位是 1,那么该字符可能占⽤了两个字节,也可能占⽤了四个字节,不能妄下断论,所以还要继续往后扫描:如果第⼆个字节的⾼位有两个连续的 0,那么就会断定该字符占⽤了四个字节;
如果第⼆个字节的⾼位没有连续的 0,那么就会断定该字符占⽤了两个字节。
可见,当字符占⽤两个或者四个字节时,GB18030 编码要检测两次,处理效率⽐ GB2312 和 GBK 都低。
GBK 编码最⽜掰
GBK 于 1995 年发布,这⼀年也是互联⽹爆发的元年,国⼈使⽤电脑越来越多,也许是 GBK 这头猪正好站在风⼝上,它就飞起来了,后来的中⽂版 Windows 都将 GBK 作为默认的中⽂编码⽅案。
注意,这⾥我说 GBK 是默认的中⽂编码⽅案,并没有说 Windows 默认⽀持 GBK。Windows 在内核层⾯使⽤的是 Unicode 字符集(严格来说是 UTF-16 编码),但是它也给⽤户留出了选择的余地,如果⽤户不希望使⽤ Unicode,⽽是希望使⽤中⽂编码⽅案,那么这个时候Windows 默认使⽤ GBK(当然,你可以选择使⽤ GB2312 或者 GB18030,不过⼀般没有这个必要)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论