1. 字符(character):字符是各种文字和符号的总成,包括各国家文字,标点符号,图形符号,数字等。
2. 字符集(character set):字符的集合,比如说,ASCII字符集,GB2312字符集,BIG5字符集,Unicode字符集
3. 字符编码(characer encoding): 为了使计算机识别字符集并进行处理,需要对字符集进行编码,而编码形式就称为character encoding
比如经典的莫尔斯编码(Morse code)就是一种字符编码方案
从编程的角度看,字符编码集合其实就是key-value集合,例如在ASCII编码方案中,
key --> value
0x61 --> a
在GB2312编码方案中,
key --> value
0xa3e1 --> a(全角字母a)
ucs标准
unicode是国际标准组织制定的,包含所有符号的编码方案,这么做的一个好处是可以很方便的解决乱码问题,比如一个韩文的网页,如果使用utf8编码,那么在其他语言系统上打开网页,也能正确显示韩文。
ucs = unicode character set,ucs有两种格式,ucs-2和ucs-4,ucs-2意思就是用两个字节对字符进行编码,而ucs-4则用4个字节对字符进行编码,因此可以得出
对于ucs-2,最多可以表示2^16 = 65536个字符
对于ucs-4,最多可以表示2^31 = 2147483648个字符(实际只用了31位,最高位规定为0)
而目前来说,ucs-2已经能满足大部分的需求了,对于类似英语的语言,需要编码的只是几十个字母和一些符号而已,而对于中文,则需要多一点码位了,常用的中文汉字只有4000多个,但是完整的中文字符估计有40000个以上,所以实际上,ucs-2只包含了常用的汉字。ucs-2把CJK(中日韩)字符一起放在了0x4E00 - 0x9FCB区间(unicode 6.0标准)。
ucs-2的字符编码表可以在unicode官网上找到
http://www.unicode.org/charts/
utf-8
ucs只规定了如何用多个字节来表示字符,并没有规定传输和存储,就比如说某个标准规定用7位来表示一个字符,但是并没有指定怎样的7位,所以可以有各种实现:一个字节的低7位,高7位,两个字节取前一个字节后4位和后一个字节后3位等。所以,UTF-8只是对ucs2规定的65536个字符进行编码的一种方案
utf-8编码方案采用1-3个字节来对ucs2进行编码,编码规则如下
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
0000-007F是ASCII字符集的范围,因此采用UTF-8编码方案,表示一个ASCII字符只需要一个字节,而上面提到CJK的unicode范围所0x4E00 - 0x9FCB,所以表示一个中文汉字需要3个字节,utf8的字节流形式只有这三种,所以可以通过这三种形式对字节流进行校验,以判断是否是合法的utf8字节流。但要注意合法并不代表就是utf8编码的字节流。
gb2312编码
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
GBK编码
只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容
----
表达不是很好,有不正确的请指出
参考资料
http://www.kuqin.com/language/20080507/8129.html 谈谈Unicode编码
http://www.kuqin.com/language/20080507/8130.html 字符编码笔记:ASCII,Unicode和UTF-8
http://www.iteye.com/topic/398782 说说字符集和编码
http://www.unicode.org/charts/ Unicode 6.0 Character Code Charts