字符集编码概述

1.big endian和little endian是CPU处理多字节数的不同方式

如‘汉’字的Unicode编码是6C49。那么写到文件里时若将6C写在前面,就是big endian。将49写在前面,就是little endian

2.字符编码、内码及汉字编码

字符必须是编码后才能被计算机处理,计算机使用的缺省编码方式就是内码。早期计算机使用8位的ASCII编码(一个字节的编码规范,代表一个字符),为处理汉字设计GB2312用于简体中文和big5用于繁体中文

GB2312(1980)共收录7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312支持汉字太少,1995年汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。 2000年的GB18030是取代GBK1.0的正式国家标准,该标准收录27484个汉字,同时还收录藏文、蒙文、维吾尔文等主要少数民族文字,现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求,所以手机、MP3一般只支持GB2312

从ASCII、GB2312、GBK到GB18030这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面标准支持更多的字符。在这些编码中,英文和中文可以统一地处理,区分中文编码的方法是高字节的最高位不为0。有的中文Windows的缺省内码还是GBK,可以通过GB18030包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到,通常我们还是用GBK指代中文Windows内码

3.Unicode、UCS和UTF

Unicode(至少以两个字节表示,汉字是3个字节,英文字母是两个字节)只与ASCII兼容(即ISO-8859-1兼容)与GB码不兼容。Unicode是一种由国际组织设计的字符编码方法,可容纳全世界所有文字的编码方案,学名是"Universal Multiple-Octet Coded Character Set"简称为UCS。UCS可以看作是"Unicode Character Set"的缩写

UCS只规定如何编码,没有规定如何传输、保存编码。例如“汉”字的UCS编码是6C49,可以用4个ascii数字来传输+保存这个编码;也可用utf-8编码:3个连续字节E6 B1 89来表示。关键在于通信双方都认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案,UTF-8的特别好处是它与ISO-8859-1完全兼容。UTF是“UCS Transformation Format”的缩写

4.内码与code page

目前Windows内核已经采用Unicode编码,这样在内核上可以支持全世界所有语言文字。但是由于现有大量程序和文档都采用某种特定语言编码,例如GBK,Windows不可能不支持现有的编码,而全部改用Unicode

Windows使用代码页(code page)来适应各个国家和地区。code page可以被理解为前面提到的内码。GBK对应的code page是CP936GB18030 code page:CP54936。但由于GB18030有一部分4字节编码,而Windows代码页只支持单字节和双字节编码,所以这个code page是无法真正使用的

5.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

https://blog.csdn.net/wanghuiqi2008/article/details/8079071

例如“汉”字Unicode编码是6C49,6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,用这个比特流依次代替模板中的x,得到:11100110 10110001 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却要用于实际的传输,所以就不得不考虑字节序的问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章