一 字符常见的几种编码方式
无论在是在'编辑文本文件'的时候,还是在'制作网页'的时候,总会遇到'文本编码方式'的问题
问题:如果处理不当,就会'出现乱码'的问题
常见的一些'字符编码'方式无非有:'Unicode'、'ASCII'、'GBK'、GB2312、'UTF-8'
二 常见的字符编码方式说明
(1)字节和位的关系
++++++++++++++'字节和位的关系'++++++++++++++
我们知道,计算机内部,所有'信息'最终都是一个'二进制值',每一个二进制位(bit)有0和1两种状态,因此'八个二进制位'就可以组合出'256种状态',这被称为'一个字节'(byte)
1byte=8bit
也就是说: 一个字节一共可以用来表示'256种'不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111
注意: '字符(character)'不等于'符号(symbol;)'
(2) ASCII码
十九世纪'60年代','美国'制定了一套字'符编码',对应'英语字符'与'二进制位'之间的关系,做了'统一规定',这被称为 'ASCII 码',一直沿用至今.
ASCII 码一共'规定了128个字符'的'编码',比如'空格-->SPACE'是32(二进制00100000),'大写的字母'A是65(二进制01000001)
备注1: 这128个符号包括'英文字符'、'阿拉伯数字'、'西文字符'以及'32个控制字符'(不能打印出来的控制符号)它用'一个字节来表示具体的字符',但它只用'后7位'来表示字符(2^7=128),'最前面'的一位统一规定为'0'
备注2:ASCII 表上的数字' 0–31 '分配给了'控制字符',用于控制像打印机等一些'外围设备'
(3)扩展的ASCII码
背景: 原本的ASCII码对于'英文语言的国家'是够用了,但是'欧洲国家'的一些'语言会有拼音',这时'7个字节'就'不够用'了
引出: 因此一些'欧洲国家'就决定,利用'字节中闲置的最高位'编入'新的符号'
比如: 法语中的é的编码为130(二进制10000010)
结果: 这样一来,这些'欧洲国家'使用的编码体系,可以表示'最多256个符号'
+++++++++++++++'扩展ASCII引出的问题'+++++++++++++++
问题引出: 但这时问题也出现了,'不同的国家有不同的字母',因此哪怕它们都'使用256个符号的编码'方式,'代表的字母'却'不一样'
比如:130在'法语编码中'代表了é,在'希伯来语编码中'却代表了字母Gimel (ג),在'俄语编码中'又会代表另一个符号
解决策略: 但是不管怎样,所有这些编码方式中,'0—127表示的符号是一样的','不一样'的只是'128—255'的这一段
引出: 这个问题就直接'促使了Unicode编码'的产生
(4) Unicode符号集
+++++++++'乱码的由来'+++++++++
正如上一节所说: 世界上存在着'多种编码方式','同一个二进制数字'可以被'解释成不同的符号',因此要想'打开一个文本文件',就必须知道它的'编码方式',否则用'错误的编码方式'解读,就会'出现乱码'
举例: 为什么电子邮件常常出现乱码?就是因为'发信人和收信人'使用的'编码方式'不一样
+++++++++'Unicode引出'+++++++++
Unicode就是这样一种编码:它包含了'世界上所有的符号',并且'每一个符号'都是'独一无二'的
比如: U+0639表示'阿拉伯字母Ain',U+0041表示'英语的大写字母A',U+4E25表示汉字"严"
查看方式: 具体的符号对应表,可以'查询unicode.org'或者'专门的汉字对应表'
++++++++++'Unicode是一个符号集'++++++++++
很多人都说Unicode编码('说法不准确'),但其实Unicode'是一个符号集'(世界上所有符号的符号集),而'不是一种新'的编码方式
但是正因为Unicode包含了所有的字符,而'有些国家'的'字符用一个字节'便可以表示,而'有些国家'的字符要用'多个字节'才能表示出来
即产生了两个问题:
1)第一:如果'有两个字节'的数据,那'计算机怎么知道'这'两个字节是表示一个汉字'呢?还是'表示两个英文字母'呢?
2)第二:因为'不同字符'需要的'存储长度'不一样,那么如果Unicode规定用2个字节存储字符,那么英文字符存储时前面1个字节都是0,这就大大'浪费了存储空间'
上面两个问题'造成的结果'是:
1)出现了unicode的'多种存储方式',也就是说有许多种'不同的二进制格式',可以用来表示unicode
2)unicode在很长一段时间内'无法推广',直到'互联网的出现'
注意:Unicode '只是一个符号集',它'只规定了'符号的二进制代码,却'没有规定'这个二进制代码应该'如何存储'
(5) UTF-8
互联网的普及,强烈要求出现一种'统一的编码方式','UTF-8'就是在互联网上'使用最广'的一种unicode的实现方式,'其他实现方式'还包括UTF-16和UTF-32,不过在互联网上'基本不用'
UTF-16(字符用'两个字节'或'四个字节'表示)和 UTF-32(字符用'四个字节'表示)
重复一遍:这里的'关系是'-->'UTF-8是Unicode的实现方式之一'
UTF-8最大的一个特点:就是它是一种'变长的编码方式',它可以使用'1~4个字节'表示一个符号,根据'不同的符号'而变化字节长度
UTF-8的编码规则
1)对于'单字节的符号',字节的'第一位设为0,'后面7位为'这个符号的unicode码',因此对于'英语字母',UTF-8编码和ASCII码是'相同的'
2)对于'多(n)字节'的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的'没有提及'的二进制位,全部为这个符号的unicode码
(6) GBK/GB2312/GB18030
GBK和GB2312都是'针对简体字'的编码,只是GB2312只支持'六千多个汉字'的编码,而GBK'支持1万多个汉字'编码,而GB18030是用于'繁体字的编码',汉字存储时都'使用两个字节'来储存
(7)编码规则
字母'x'表示'可用编码的位'
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',就表示'当前字符占用多少个字节'
(8)计算机怎么知道某一个文件到底采用哪一种方式编码?
UCS-2 格式可以存储 Unicode 码(码点不超过
0xFFFF
)。以汉字严
为例,Unicode 码是4E25
,需要用两个字节存储,一个字节是4E
,另一个字节是25
。存储的时候,4E
在前,25
在后,这就是 Big endian 方式;25
在前,4E
在后,这是 Little endian 方式。Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用
FEFF
表示。这正好是两个字节,而且FF
比FE
大1
。如果一个文本文件的头两个字节是
FE FF
,就表示该文件采用大头方式;如果头两个字节是FF FE
,就表示该文件采用小头方式
(9) 小结
ASCII编码: 用来'表示英文',它'使用1个字节'表示,其中'第一位规定为0',其他'7位存储'数据,一共可以表示'128个'字符
拓展ASCII编码: 用于表示更多的'欧洲文字',用'8个位存储'数据,一共可以表示'256个'字符
GBK/GB2312/GB18030: 表示'汉字','GBK/GB2312'表示'简体中文','GB18030'表示'繁体中文'
Unicode编码: 包含世界上所有的字符,是一个'字符集'
UTF-8: 是Unicode字符的'实现方式之一',它使用'1-4个字符-->可变长'表示一个'符号',根据不同的符号而变化字节长度
++++++++++++++'GBK和UTF-8中文字符对应的字节个数'++++++++++++++
GBK: 是在'国家标准GB2312基础'上扩容后'兼容GB2312的标准(好像不是国家标准)',GBK编码'专门'用来'解决中文编码'的,是'双字节'的,不论中英文'都是双字节'的
UTF-8 编码是用以解决'国际上'字符的一种'多字节编码',它对'英文'使用8位(即'一个字节'),'中文'使用24位('三个字节')来编码
对于英文字符较多的论坛则用'UTF-8节省空间',另外如果是外国人'访问你的GBK网页',需要'下载中文语言包'支持,访问UTF-8编码的网页则'不出现'这问题。可以直接访问