编码介绍
各个编码格式介绍
GB2312 / GBK / GB18030 / Unicode / UTF-8
GB2312
“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”
GB2312是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》。1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。
GB2312 仅收汉字 6763 个,这大大少于现有汉字
GB2312 规定 “对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
- GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
GBK
GBK亦采用双字节表示,即不论中、英文字符均使用双字节来表示
- GBK向下与GB2312 完全兼容,向上支持ISO 10646 国际标准,
- 在前者向后者过渡过程中起到的承上启下的作用。GBK亦采用双字节表示,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1,总体编码范围为8140-FEFE之间,首字节在81-FE 之间,尾字节在40-FE 之间,剔除 XX7F 一条线。
- GBK 共收入21886个汉字和图形符号,包括:
* GB2312中的全部汉字、非汉字符号; * BIG5中的全部汉字; * 与ISO 10646相应的国家标准GB13000中的其它 CJK 汉字,以上合计20902个汉字; * 其它汉字、部首、符号,共计984个;
GB18030
- GB18030 是最新的汉字编码字符集的国家标准,向下兼容 GBK 和 GB2312 标准。
- GB18030 编码是一二四字节变长编码。
- GB18030编码在码位空间上做到了与Unicode标准一一对应,这一点与UTF-8编码类似。
Unicode
- Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
- Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符。
- Unicode只是一个符号集, 它只规定了符号的二进制代码, 却没有规定这个二进制代码应该如何存储。
- 比如UTF-8、UTF-16、UTF-32都是Unicode编码的实现方式,不过UTF-8是使用最多的实现。
UFT-8
UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,是在互联网上使用最广的一种unicode的实现方式。
- UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,因此可以节省存储空间。
- 它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。
- UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
UTF-8的编码规则很简单,只有二条:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的;
- 对于n字节的符号,第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的二进制位,表示为这个符号的unicode码;
另外像ASCII只用于英文字符编码,BIG5编码是通行于台湾、香港地区的一个繁体字编码方案,虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。
总结
- ASCII用于表示英文字符,是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符;
- GB2312简体中文的编码格式, 只支持6763个常用汉字;
- GBK是GB2312基础上扩容后兼容GB2312的标准,包含全部中文字符,支持简体中文及繁体中文;
- GBK通用性比UTF8差,不过UTF8占用的数据库比GBK大;
- GB2312、GBK到GB18030都属于双字节字符集 (DBCS);
- 从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0;
GBK和UTF-8的相互转换
一般来说UTF-8可应用于大多数场景,尤其是互联网上,而中文编码主要使用GBK编码,因此这就有了GBK、GB2312和UTF-8的相互转换需求。
- GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换
- GBK、GB2312 —> Unicode —> UTF-8
- UTF8 —> Unicode —> GBK、GB2312
GBK和UTF-8编码的检测
但如果给定一个字符串,能够检测出其编码是什么吗? 比如对于“中国.北京”,检测出其为GBK或GB2312,而对于
”涓浗.鍖椾含“检测出其为UTF-8。