字符编码小记
2016-02-03 14:19
330 查看
字符编码
(1)字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
(2)字符集(Characterset)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。
(3)编码方案。计算机要准确的处理各种字符集文字,需要对字符进行编码,以便计算机能够识别和存储各种文字。编码的含义就是,如何用一个01串表示一个字符集中的某一个字符。
(4)一个字符集,可以使用至少一种编码方案。比如,Unicode是字符集,同时Unicode也是编码方案,UTF8,UTF16,UTF32这三个也都是Unicode字符集的编码方案。
(5)通常,编码方案的名称也使用与字符集相同的名称。这是因为字符集指定的时候,也同时考虑了存储时的编码方案。如GB2312既是字符集也是编码方案。
单字节:只使用一个字节表示字符。
多字节:使用1个至2个表示字符。
宽字节:使用4字节表示字符。
其中,单字节和宽字节,字符所占用的字节数是固定的。多字节字符所占的字节数不固定。
(2)它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。4字节可表示40亿个字符。
(3)(并不是所有的数字都用上了,但是总数已经超过了65535,所以2个字节的数字是不够用的。)被几种语言共用的字符通常使用相同的数字来编码,除非存在一个在理的语源学(etymological)理由使不这样做。不考虑这种情况的话,每个字符对应一个数字,每个数字对应一个字符。即不存在二义性。
在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统。
ASCII码(American Standard Code for Information Interchange)是美国标准信息交换码,有ANSI制定。ASCII既是一个字符集也是一种编码方案。
基本ASCII集只有127个字符。占7bit。扩展ASCII多包含128个字符。占8bit。一个ASCII字符占1个字节。
为了显示本国的语言,且兼容ASCII,产生了一种2个字节表示的编码方式。由于ASCII码占用7位的历史原因,所以这种2个字节的编码方式规定:对于连续的2个字节,只有在2个字节的bit7都是1的情况下,才认为这2个字节合起来表示一个汉字。这样不同长度混排的编码方法,通常被叫做"MBCS(Muilti-Bytes Charecter Set,多字节字符集)",如"中文ABC"这串文本,它所占用的字节数可能就是:2×2+3=7。由于MBCS是兼容ANSI的ASCII的,因此MBCS也使用ANSI做简称。
但是,因为不同的国家和地区制定了不同的MBCS,因此各国的MBCS是不同、且不兼容的。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,所以在中文 windows下要转码成gb2312,gbk只需要把文本保存为ANSI
编码即可。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字符。这样就容易造成混乱。导致了unicode码的诞生。
其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。
Unicode 是基于UCS的标准来发展。
UTF-8使用一至四个字节为每个字符编码
2312。
GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。GB2312字符的排列分布情况见表1-4。
表1-4 GB2312 字符编码分布表
GB2312字符在计算机中存储是以其区位码为基础的,其中汉字的区码和位码分别占一个存储单元,每个汉字占两个存储单元。
GBK是微软对GB2312的扩展。
GB18030是对GBK的扩展,兼容GBK和GB2312。支持7万多汉字。由中国标准化司发布。
Big5,又称为大五码或五大码,是繁体中文字符集标准,共收录13,060个汉字。
1. 基础概念
“字符编码”分为 字符集 和 编码方案 两个含义。(1)字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
(2)字符集(Characterset)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。
(3)编码方案。计算机要准确的处理各种字符集文字,需要对字符进行编码,以便计算机能够识别和存储各种文字。编码的含义就是,如何用一个01串表示一个字符集中的某一个字符。
(4)一个字符集,可以使用至少一种编码方案。比如,Unicode是字符集,同时Unicode也是编码方案,UTF8,UTF16,UTF32这三个也都是Unicode字符集的编码方案。
(5)通常,编码方案的名称也使用与字符集相同的名称。这是因为字符集指定的时候,也同时考虑了存储时的编码方案。如GB2312既是字符集也是编码方案。
2.
编码方案,在存储的实现上,可分为:单字节,多字节,宽字节。单字节:只使用一个字节表示字符。
多字节:使用1个至2个表示字符。
宽字节:使用4字节表示字符。
其中,单字节和宽字节,字符所占用的字节数是固定的。多字节字符所占的字节数不固定。
3. 概念区分
字符集 | 编码方案 |
Unicode GB2312 GBK GB18030 BIG5 ASCII JIS | Unicode UTF-8 UTF-16 UTF-32 GB2312 GBK GB18030 BIG5 ASCII JIS |
4. Unicode
(1)Unicode编码系统为表达任意语言的任意字符而设计。Unicode是一种编码系统。(2)它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。4字节可表示40亿个字符。
(3)(并不是所有的数字都用上了,但是总数已经超过了65535,所以2个字节的数字是不够用的。)被几种语言共用的字符通常使用相同的数字来编码,除非存在一个在理的语源学(etymological)理由使不这样做。不考虑这种情况的话,每个字符对应一个数字,每个数字对应一个字符。即不存在二义性。
在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统。
5. 各种概念
5.1 ANSI & ASCII & MBCS & Unicode的诞生与渊源
ANSI是美国国家标准局的简称。ASCII码(American Standard Code for Information Interchange)是美国标准信息交换码,有ANSI制定。ASCII既是一个字符集也是一种编码方案。
基本ASCII集只有127个字符。占7bit。扩展ASCII多包含128个字符。占8bit。一个ASCII字符占1个字节。
为了显示本国的语言,且兼容ASCII,产生了一种2个字节表示的编码方式。由于ASCII码占用7位的历史原因,所以这种2个字节的编码方式规定:对于连续的2个字节,只有在2个字节的bit7都是1的情况下,才认为这2个字节合起来表示一个汉字。这样不同长度混排的编码方法,通常被叫做"MBCS(Muilti-Bytes Charecter Set,多字节字符集)",如"中文ABC"这串文本,它所占用的字节数可能就是:2×2+3=7。由于MBCS是兼容ANSI的ASCII的,因此MBCS也使用ANSI做简称。
但是,因为不同的国家和地区制定了不同的MBCS,因此各国的MBCS是不同、且不兼容的。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,所以在中文 windows下要转码成gb2312,gbk只需要把文本保存为ANSI
编码即可。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字符。这样就容易造成混乱。导致了unicode码的诞生。
其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。
5.2 UCS
通用字符集(UniversalCharacter Set,UCS)Unicode 是基于UCS的标准来发展。
5.3 UTF-32
UTF-32又称UCS-4是一种将Unicode字符进行编码的协定,对每个字符都使用4字节。5.4 UTF-16
尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符。因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)。5.5 UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。UTF-8使用一至四个字节为每个字符编码
5.6 ASCII
ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。5.7 GB2312
GB2312也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312。
GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。GB2312字符的排列分布情况见表1-4。
表1-4 GB2312 字符编码分布表
分区范围 | 符号类型 |
第01区 | 中文标点、数学符号以及一些特殊字符 |
第02区 | 各种各样的数学序号 |
第03区 | 全角西文字符 |
第04区 | 日文平假名 |
第05区 | 日文片假名 |
第06区 | 希腊字母表 |
第07区 | 俄文字母表 |
第08区 | 中文拼音字母表 |
第09区 | 制表符号 |
第10-15区 | 无字符 |
第16-55区 | 一级汉字(以拼音字母排序) |
第56-87区 | 二级汉字(以部首笔画排序) |
第88-94区 | 无字符 |
5.8 几种汉字字符集的关系
GB2312是简体中文编码表。支持6000多汉字。由中国标准化司发布。GBK是微软对GB2312的扩展。
GB18030是对GBK的扩展,兼容GBK和GB2312。支持7万多汉字。由中国标准化司发布。
Big5,又称为大五码或五大码,是繁体中文字符集标准,共收录13,060个汉字。
相关文章推荐
- 接收新信息,在会话中看不到(thread表数据插入/更新失败)
- [html5]localStorage的原理和HTML5本地存储安全性
- (21)纹理缓存(Texture Cache)
- 慕课学习笔记之过滤器篇
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- [ERROR] IO error while decoding 路径 routes_reverseRouting.scala with UTF-8 问题解决
- 理解Java设计模式编程中的迪米特原则
- 【博客大赛】VHDL中信号与变量的区别及赋值的讨论
- Core Animation实例3-倒影效果(CAReplicatorLayer复制层)
- Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
- javascript函数声明
- 【一步一步学NPOI】4.字体与背景
- JSP 隐式对象
- jQuery原理系列-Dom Ready
- 【MIG专项测试组】如何量化Android应用的“卡”?—流畅度原理&定义篇
- js 鼠标放上去显示浮层
- (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- 如何解决Angular 2 的templateUrl和styleUrl的路径问题?
- 本地执行Spark程序示例
- 阿里云存储封装类 AliYunOssUtility