1、为什么需要字符编码?
计算机中储存的信息都是用0|1二进制数表示的,那么英文、汉字、等字符以及图片、视频如何在计算机中表示?按照何种规则将字符存储在计算机中
按照何种规则将字符存储在计算机中称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码"。
2、字符,字符集,字符编码概念
**字符**:在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。即一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。
**字符集**:多个字符的集合。例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。
**字符编码**:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲),以便文本在计算机中存储和通过通信网络的传递。
字符集和字符编码的关系 :
字符集是书写系统字母与符号的集合,而字符编码则是将字符映射为一特定的字节或字节序列,是一种规则。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型)),因此基本上可以将两者视为同义词。
3、常用字符集和字符编码
3.1、单字节
采用一个字节(8位)进行编码,常见字符集和编码如下:
**ASCII字符集**(American Standard Code for Information Interchange),128个字符,用7位二进制表示(00000000-01111111即0x00-0x7F);:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
**ASCII编码**:将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的[欧洲](http://baike.baidu.com/view/3622.htm)常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。ASCII字符集映射到数字编码规则如下图所示:
EASCII(Extended ASCII),256个字符,用8位二进制表示(00000000-11111111即0x00-0xFF)。
3.2、双字节
采用二个字节(16位)进行编码,常见字符集和编码如下:
**GBXXXX字符集&编码**
中文怎么办?字符集里边的字符那么多,1个字节不够,那就用2个字节。
**GB2312**:规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
**GB2312的问题**:它所收录的汉字已经覆盖中国大陆99.75%的使用频率。对于[人名](http://zh.wikipedia.org/wiki/人名)、[古汉语](http://zh.wikipedia.org/wiki/古汉语)等方面出现的[罕用字](http://zh.wikipedia.org/wiki/罕用字),GB2312不能处理,这导致了后来[GBK](http://zh.wikipedia.org/wiki/GBK)及[GB 18030](http://zh.wikipedia.org/wiki/GB_18030)汉字字符集的出现
**GBK(Chinese Internal Code Specification)**是GB2312的扩展(gbk编码能够用来同时表示繁体字和简体字),按理说都属于双字节编码,码位是一样的,根本谈不上扩展,但实际上是预留空间在起作用。比如下图为GBK的编码空间,GBK/1、GBK/2是GB2312的区域,GBK/3、GBK/4、GBK/5是GBK的区域,红色是用户自定义区域,白色可能就是由于变长编码损失的区域了。
3.3、多字节
在[计算机科学]领域中,**Unicode**(**统一码**、**万国码**、**单一码**、**标准万国码**)是业界的一种标准字符集,它可以使电脑得以体现世界上数十种文字的系统。
**Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。**
**UTF-16**:2个字节
UTF-32:4个字节
**UTF-8**:UTF-8:被定义为将代码点编码为1至4个字节,具体取决于代码点数值中有效位的数量。
前128个字符(US-ASCII)需要一个字节。接下来的1,920个字符需要两个字节进行编码,其中涵盖了几乎所有拉丁字母字母的其余部分,还包括希腊语,西里尔语,科普特语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语,塔那那语和N'Ko字母以及组合变音词马克。剩余基本多语言平面中的字符需要三个字节,其中几乎包含所有常用字符,包括大多数字符中文,日文和韩文字符。Unicode的其他平面中的字符需要四个字节,其中包括不常见的CJK字符,各种历史脚本,数学符号和表情符号(象形符号)。
4、GBK和UTF-8
GBK的编码中文和符号是双字节,字符和整型是单字节。utf-8的中文和符号是三字节,字符和整型是单字节。所以整体来说是不兼容的,但如果你的文本存的都是字符和数值,这样子是不会出现乱码的。