计算机编码简析
目录
摘要.. 1
1.引言.. 2
1.1.计算机编码发展. 2
1.2.计算机常见编码. 2
1.3.不同环境下编码. 2
2.计算机常见字符编码介绍.. 3
2.1. ASCII 字符集. 3
2.11.定义. 3
2.12.包含内容. 3
2.13.编码方式. 3
2.2.GB2312 字符集. 4
2.21.定义. 4
2.22.包含内容. 4
2.23.编码方式. 4
3.GBK 字符集. 4
3.1定义. 5
4.BIG5 字符集. 5
4.1.定义. 5
4.2.包含内容. 5
4.3.编码方式. 5
5.GB18030 字符集. 5
5.1.定义. 5
5.2.包含内容. 6
5.3.编码方式. 6
6.ISO8859-16
7.Unicode 字符集. 6
7.1.定义. 6
7.2.包含内容. 7
7.3.编码方式. 7
8.UTF-87
9.UTF-167
10.UTF-328
3.计算机编码常见问题及编码选择.. 8
3.1.关于 Unicode 编码的一个问题. 8
3.2.UTF-16 与 UTF-8选择. 8
4.SQL中字符编码分析比较.. 9
4.1.简要说明. 9
4.2.char与varchar类型比较. 9
4.3.text编码. 9
5.参考文献.. 10
6.结论与建议.. 10
致谢.. 10
摘要
正如人们用语言在人与人之间进行交流一样,计算机编码是为了在人和机器之间进行信息转换,以便人和计算机进行有效的交流。换句话说,编码即是交流。计算机有不同的编码方式实现对不同图文、符号等的处理,以便计算机能识别和存储各种信息。计算机中字符编码就是一种常见的编码,在各种各样的计算机编码中不同的编码都是为了实现不同的目的,应用于不同的领域,因此,在计算机编程中就需要我们针对实际问题选择合适的计算机编码。
关键词:计算机编码 交流 编码方式
在计算机中,最基础的是位(bit);接着是字节(Byte)、KB、MB、KM、GB、TB;之后出现了进制:二进制、八进制、十进制、十六进制;接着是上层建筑字符,常用的字符名称有:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。这些字符编码使得计算机能够识别和存储各种文字。
微软默认使用的中文编码是GB2312编码。Linux默认使用UTF-8编码,UTF-8是开源的编码标准,并且支持世界绝大多数国家语言的编码,具有“万国码”之称。
Windows中窄字符就是MBCS编码,即多字节编码,如中文Windows就是GBK(这一系列GB2312,GBK,GB18030等),MBCS编码兼容ASCII码。Windows宽字符编码就是Unicode编码,采用UTF-16编码。而Linux中窄字符编码即UTF-8(可配,系统默认一般为UTF-8),而宽字符编码为UTF-32。
字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多少字节表示等问题,则是由编码来决定的。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示英语和一些西欧语言,是现今最通用的单字节编码系统。
控制字符:回车键,退格,换行键等。
可显示字符:英文大小写,阿拉伯数字,西文符号。
扩展字符集:表格符号,计算符号,希腊字母,拉丁符号。
第 0-31 号及第127 号是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通讯专用符:SOH(文头)、EOT(文尾)、ACK(确认)等。
第32-126号是字符,其中 48-57 号为 0-9 十个阿拉伯数字,65-90 号为 26 个大写英文字母,97-122 号为 26 个英文小写字母,其余为一些标点符号,运算符号等。
在计算机存储单元中,一个 ASCII 码值占一个字节(8 个二进制位),最高位是用作奇偶检验位*。
注:标*的奇偶校验是指在代码传送的过程中,用来检验是否出错的一种方法。奇偶校分为奇校验和偶校验。奇校验规定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数则在最高位添 1;偶校验规定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添1。
又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集?基本集》,是中国标准的简体中文字符集,它所收录的汉字已经覆盖 99.75%的使用频率,基本满足了汉字的计算机处理需要,在中国大陆和新加坡广泛使用。
GB2312 收录了简化汉字及一般字符,序号,数字,拉丁字母,日文假名,希腊字母,俄文字母,汉语拼音符号,汉语注音字母,共 7445 个图形字符。其中包括 6763 个汉字,一级汉字 3755 个,二级汉字 3008 个。
GB2312 对所收汉字进行了“分区”处理,每区含有 94 个汉字或者符号,这种表示方法也叫做“区位码”。它是用双字节表示的,前面的字节为第一字节,又称“高字节”,后面的为第二字节,“低字节”。高位字节把 01-87 区的区号加上 0xA0(相当于数字 160);低位字节把 01-94区的区号加上 0xA0(相当于数字 160)。
举个简单的小例子:第一个汉字——“啊”,它的区号为 16,位号 01,则区位码是 1601。则高字节位:16+0xA0=0xB0;低字节位:01+0xA0=0xA1,所以“啊”的汉字处理编码为0xB0A1。
GBK 是 GB2312 字符集的扩展(K)(中国的中文编码表升级,融合了更多的中文文字符号),它收录了 21886 个符号,它分为汉字区和图形符号区,汉字区包括 21003 个字符。GBK 字符集主要扩展了繁体中文字的支持。
又称大五码,由台湾五家软件公司创立。因为当时台湾没有一个标准的字符集,而且 GB2312 又没有收录繁体字,所以才推出了 BIG5。
BIG5 字符集共收录了 13053 个中文字,该字符集在台湾使用。但是没有考虑到社会上流通的人名,地方用字,方言用字,化学及生物科等用字,没有包含日文平假名及片假字母。
BIG5 也采用双字节存储方法,一两个字节编码一个字。高位字节的编码范围是 0xA1-0xF9,低位字节的编码范围是 0xA1-0xFE。
GB18030的全称是GB18030-2000《信息交换用汉字编码字符集基本记得扩充》 。该字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。
该标准的字符总编码空间超过 150 万个编码位,收录了 27484 个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆,香港,台湾,日本和韩国等东南亚地区信息交换多文种,大字量,多用途,统一编码格式的要求。
GB8030 标准采用单字节,双字节和四字节三种方式对字符编码。单字节部分使用 0x00-0x7F 码(对应于 ASCII 码的相应码);双字节部分,首字节码从 0x81-0xFE,尾字节码分别是 0x40-0x7E 和 0x80-0xFE。四字节部分采用 0x30-0x39 作为双字节编码扩充的后缀,这样扩充的四字节编码,其范围是 0x81308130-0x0xFE39FE39,其中第一,三个字节编码位均为0x81-0xFE,第二,四字节部分采用GB/T 11383未采用的 0x30-0x39作为对双字节编码扩充的后缀。
属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。
Unicode 字符集编码是(University multiple-object coded character set)通用多八位编码字符集的简称。融合了多种文字,所有文字都用两个字节来表示,支持世界上超过 650 种语言的国际字符。Unicode 允许在同一服务器上混合使用不同语言,它为每种语言的每个字符设定了统一并且唯一的二进制编码,以满足跨平台,跨语言进行文本转换,处理的要求。它不兼容任何编码。相对于iso8859-1编码来说,Unicode编码只是在前面增加了一个0字节,比如字母a为"00 61"。定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而Unicode又可以用来表示所有字符,所以在很多软件内部是使用Unicode编码来处理的,比如java。
7.2.包含内容
Unicode 标准始终使用十六进制数字,固定使用 2 个字节来表示一个字符,共可以表示 65536 个字符。而且书写时在前面加上前缀“U+”,例如 A 的编码是 004116,则书写成“U+0041”。
考虑到Unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,Unicode也需要两个字节来表示。所以Unicode不便于传输和存储。因此而产生了UTF编码,UTF编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,UTF编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,UTF编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
注意,虽然说UTF是为了使用更少的空间而使用的,但那只是相对于Unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然UTF编码对汉字使用3个字节,但即使对于汉字网页,UTF编码也会比Unicode编码节省,因为网页中包含了很多的英文字符。
UTF8 是 Unicode 其中的一个使用方式,最多用三个字节来表示一个字符。UTF 的意思是:Unicode translation format,即把 Unicode 转作某种格式的意思。 UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。UTF-8使用可变长度字节来存储 Unicode 字符,如 ASCII 字母还是采用一个字符来存储,希腊字母等采用 2 个字符来存储,而常用的汉字要使用 3 字节,辅助平面字符则使用 4 字节。
使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码,即 2 个字节表示一个字符。
将每一个 Unicode 代码点表示为相同值的 32 位整数。
使 用 记 事 本 另 存 为 时 , 可 以 在 ANSI , GBK,Unicode ,Unicode big endian 和 UTF-8 这几种编码之间相互转换。同样是 txt 文件,windows 是怎么识别编码的呢?平时注意的话可以发现 Unicode,Unicode big endian 和 UTF-8编码的 txt 文件的开头会多出几个字节,分别是(FF,FE),(FE,FF),(EF,BB,BF)。那么这些标记都是基于什么标准呢?
ANSI 字符集:ASCII 字符集,以及由此派生并兼容的字符集。
如“连通”两个字,在 UTF-16 中为:DE 8F 1A 90,两个字节决定一个汉字;在 UTF-8 中则为:E8 BF 9E E9 80 9A,即 3个字节决定一个字符。当一个软件打开一个文本时,首先是要决定这个文本究竟是使用哪种字符集的哪种编码保存的,软件一般采用三种方式来决定文本的字符集和编码:检测文件头标识,提示用户选择,根据一定的规则猜测。不同编码方式的开头字节如下:EF BB BF,UTF-8 FF FE,UTF-16,little endian FE FF UTF-16,big endianFF FE 00 00 UTF-32, little endian 00 00 FE FF UTF-32,big endian *
注:标*的endian 是指字节序,big endian(大尾)和 little endian(小尾)是 CPU 处理多字节数的不同方式。例如“汉”的 Unicode 编码是 6C49,写到文件中,如果将 6C 写在前面就是 big endian,将 49写在前面就是 little endian。
SQl中常见字符编码有char、varchar、text、nchar、nvarchar、ntext,其中nchar、nvarchar、ntext中的n代表的是National,即国际化, 也就是代表它们所使用的字符编码为Unicode。
char与nchar、varchar与nvarchar、text与ntext之间的差别都是一样的,都是加了n就代表使用Unicode编码, 当使用Unicode编码时, 所有的字符都占用两个字节,而没有加n前缀的类型, 对于英文字符和英文字符, 只会占用一个字节, 而对于其他字符(比如中文、日语等), 会占用两个字节。
对于char类型, SQL Server会为其预留出指定的空间, 不论其内容实际为多少, 它所占的空间都是固定的,而对于varchar类型, SQL Server会按保存的实际长度来分配空间(外加两个额外的字节空间, 以保存数据的偏移值)。 当然, 以上两种类型的定义中, 内容所占的空间都是不允许超过定义的空间的。
char与varchar进行对比, 它们的优缺点在于:
char优点:占用空间固定,在对其进行更新操作时, 不需要分配空间和移动数据, 执行速度相对较快。
char缺点:占用空间固定,可能会浪费空间, 而且在进行读取操作时, 也因此导致读取速度相对较慢。
varchar优点:占用空间随实际内容变化, 不会浪费存储空间, 在进行读取操作时, 因为不用读取多余的无内容字节空间, 所以速度相对较快。
varchar缺点:所占空间刚好是内容所占的空间, 所以在对其进行更新操作时, 会需要扩展空间, 会需要移动数据, 这样会使更新操作的速度相对较慢。
对于text类型, 由于char和nchar都有长度或空间限制(char最大长度为8000,nchar最大长度为4000), 而有些内容可能远远超出这个长度, 所以需要以另一种类型来进行存储, 也就是text(最大可存储2GB的内容)。
[1] 张浩,编码的秘密 清华大学出版社 2011年10月.
[2] 余强,编码的应用 清华大学出版社 2011年8月.
从 ASCII,GB2312,GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一的处理。区分中文编码的方法是高字节的最高位不为0。
计算机使用的缺省编码方式就是计算机的内码。有的中文 Windows 的缺省内码还是 GBK,可以通过 GB18030 升级包升级到 GB1030。不过相对 GBK 新增的字符,普通人很难用到的,通常我们用 GBK 来指代中文 Windows 内码。GBK2312 的原文是区位码,从区位码到内码,需要在高字节和低字节上分别加上 A0。
只有一种编码可以适用于其他编码所不能适用的场合,它就是一种有用的编码。所以我们要根据我们的需要进行选择。
虽然这次任务只花了一周的时间,我遇到过这种问题,在网上查资料也就解决了,也没有进一步的深入进去了解和思考,老师这次提出来,我突然意识到编码对于理解计算机的内部存储处理是很有用的。做这种作业才能真正学到些东西,多谢老师对我们的高要求让我们节快乐前进的脚步。
另一方面,我们之前对编码只是一点的了解,资料也很有限,我们基本上都是在网上查找资料,在各个论坛下载资料还让网友介绍了些博客文章中,感谢博友们给我的支持。
原文:http://www.cnblogs.com/SheroBlog/p/3629773.html