字符的编码、传输

找了下面几篇文章,试图理解一下字符的编码和传输。
http://www.jianshu.com/p/oHryhG
http://visionsky.blog.51cto.com/733317/895928
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

ASCII编码以及ASCII扩展
计算机内部使用Byte存储,也就是0x00 - 0xFF,共计256个编码
ASCII使用0x00 - 0x7F,共计128个编码,用于英文字母、数字、特殊字符;
其它国家进行了扩展,即ASCII扩展,但存在两个问题:
1、不通用;
2、不够用;

汉字编码
简体:GB2313 -> GBK,不断扩展,使用两个字节固定编码;
繁体:Big5

Unicode编码
为世界上所有的符号都赋予一个唯一的编码,那么乱码问题就会消失。
Unicode使用3个字节进行编码,编码范围:0x00-00-00 - 0x10-FF-FF。
Unicode只是一种编码方案,其有多种存储、传输方式,也就是实现方式,比如utf8,utf16,utf32等。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。后面每个字节都已10开头。

一个文件如何知道采用什么编码方式?另外对于存储和传输,还涉及大小端问题。
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。
BOM = Byte Order Mark,UTF8不存在LE和BE的问题,其BOM可有可无。
编码方案 BOM(十六进制)
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

Unicode码的编码范围:0x000000 ~ 0x10FFFF,三个字节。
第一个字节代表plane,共计17个plane,每个plane有65536个状态;
事实上,在Unicode 5.0版本中只用到了0,1,2,14,15,16这几个编号plane中的238605个状态。

存储逻辑
Unicode编码了世界上所有字符,但占用空间比较大,其采用编码和存储分开的逻辑,就有了多种实现方式。
utf8:变长,1-4字节;
utf16:变长,2,4字节;
utf32:定长,4字节;因为unicode只有3字节,因此直接存储。

Unicode、UCS2、UCS4
unicode的前身是UCS ?分为UCS2和UCS4两种形式。
Unicode的学名是"UniversalMultiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写。
为了使编码方案统一,UCS4承诺不再向0x10FFFF后面添加新的编码,并将UCS2作为0号plane,即BMP(Basic Multilingual Plane)。
3者之间的关系为:
UCS-4编码中0x00000000 ~ 0x0010FFFF的部分组成了Unicode编码
Unicode编码中0x000000 ~ 0x00FFFF的部分组成了UCS-2编码
因此UTF-16作为UCS-2编码的存储方案,UTF-32作为UCS-4编码的存储方案使用4个字节,还是仍然保留着。

是否可以这样认为?
UCS2 = UTF16, UCS4 = UTF32

内码
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。
DBCS:双字节字符集
CJK:中日韩
Unicode只与ASCII兼容,与GB2312,GBK,Big5都不兼容。
Windows使用代码页(code page)来适应不同的国家和地区。GBK对应的code page是CP936.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章