您当前的位置:首页 > 计算机 > 文件格式与编码

ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结

时间:02-03来源:作者:点击数:

这两天碰见一个Bug,涉及到字符编码,一通乱搜后,索性研究了下,整理出来,以便今后查阅。

ASCII码,0~127,128个,这个就不用多说了,他是计算机文明的基石。但是这里面只有英文字母,其他国家如何把本国的文字输入到电脑中呢?所以基本每种语言都有自己的字符集,如汉字就有GB2312(简体中文),BIG5(繁体中文)等等。

但不同的ANSI编码在不同语言之间是不兼容的,所以对于不同的操作系统之间文件的传输,或者在同样的操作系统下,源文件语言不同于OS的语言文件的传输,需要转换成UTF-8格式。

如何转换呢?

GBK、GB2312等与UTF-8之间都必须通过Unicode编码才能相互转换:

GBK、GB2312 --> Unicode --> UTF-8

UTF-8-->Unicode --> GBK、GB2312

具体区别:

ANSI:16384个字符。这就是ANSI字符标准。英文一个字节,中文两个字节。中文的网页和操作系统中通常采用ANSI编码,这也是微软OS的一个字符标准。对于ANSI,不同的国家和地区制定了不同的标准,由此产生了GB2312(简体中文),BIG5(繁体中文),JIS(日文)等各自的编码标准。但不同的ANSI编码在不同语言之间是不兼容的,所以对于不同的操作系统之间文件的传输,或者在同样的操作系统下,源文件语言不同于OS的语言文件的传输,需要转换成UTF-8格式。

UNICODE:使用两个字节对世界上几乎所有的语言进行编码(0x0000-0xFFFF),65536个字符,每种语言的代码段不同,两个字节(英文、中文都是两个字节)所表达的字符是唯一的,所以不同语种可以共存于文本中,解决国际化的问题。

UTF-8:是Unicode一种压缩形式,英文A在Unicode中表示为0x0041,老外觉得这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了UTF-8编码,但是汉字在UTF-8中占3个字节,显然用做中文不如ANSI合算,这就是中国的网页用作ANSI编码而老外的网页常用UTF-8的原因。

=========================================================

特别提下Unicode和UTF-8区别:

Unicode:

Unicode字符集,它固定使用16bits(两个字节)来表示一个字符,共可以表示65536个字符,标准的Unicode称为UTF-16(UTF: UCS Transformation Format )。

后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。毕竟互联网70%以上的信息仍然是英文。如果连英文都用2个字节存取(UCS-2),空间浪费不就太多了?所以UTF-8就出来了。

UTF-8: (UCS TransformationFormat)

所谓UTF-8就是这样一个为了提高英文存取效率的字符集转换格式:Unicode Transformation Form 8-bit form。用UTF-8,UNICODE的2字节字符用变长个(1-3个字节)表示:

对英文,仍然和ASCII一样用1个字节表示,这个字节的值小于128(/x80);对其他语言的用一个值位于128-256之间的字节开始,再加后面紧跟的2个字节表示,一个字符一共是3个字节;UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP字符最多只用到3字节长。Bigendian UCS-4字节串的排列顺序是预定的。字节0xFE和0xFF在UTF-8编码中从未用到。下列字节串用来表示一个字符。用到哪个串取决于该字符在Unicode中的序号。

U-00000000 - U-0000007F: 0xxxxxxx

U-00000080 - U-000007FF: 110xxxxx10xxxxxx

U-00000800 - U-0000FFFF: 1110xxxx10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF: 11110xxx10xxxxxx 10xxxxxx 10xxxxxx

U-00200000 - U-03FFFFFF: 111110xx10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx

U-04000000 - U-7FFFFFFF: 1111110x10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx

xxx的位置由字符编码数的二进制表示的位填入。越靠右的x具有越少的特殊意义。只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中,第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode字符U+00A9 = 1010 1001 (版权符号)在UTF-8里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符U+2260 = 0010 0010 0110 0000 (不等于)编码为:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

这种编码的官方名字拼写为UTF-8。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门