关于记事本另存为的编码类型知识
(涉及编程字符编码)
在软件的编码和实现中,我们可能会碰到个 ⼀个⽐较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?⼀个朋友问到了我这个问题,我虽然能回答⼀两个出来,但是感觉已经有点模糊,混乱了,在⽹上搜了搜,在书上翻了翻,总结⼀下吧。⾸先按照字符编码的历程来看:
1. ASCII
我们需要了解的最早编码是ASCII码。它⽤7个⼆进制位来表⽰,由于那个时期⽣产的⼤多数计算机使⽤8位⼤⼩的字节,因此⽤户不仅可以存放所有可能的ASCII字符,⽽且有整整⼀位空余下来。如果你技艺⾼超,可以将该位⽤做⾃⼰离奇的⽬的:WordStar中那个发暗的灯泡实际上设置这个⾼位,以指⽰⼀个单词中的最后⼀个字母,同时这也宣⽰了WordStar只能⽤于英语⽂本。
由于字节有多达8位的空间,因此许多⼈在想:“呀!我们可以把128~255之间的编码⽤做个⼈的应⽤⽬的。”问题在于,同时产⽣这种想法的⼈相当多,⽽且在128~255之间的各个位置上应该存放什么这⼀问题上,真是仁者见仁智者见智。事实上,只要⼈们开始在美国以外的地⽅购买计算机,那么各种各样的不同OEM字符集都会进⼊规划设计⾏列,并且各⼈都会根据⾃⼰的需要使⽤⾼位的128个字符。如此⼀来,甚
⾄在同语种的⽂档之间就不容易实现互换。 ASCII可被扩展,最优秀的扩展⽅案是ISO 8859-1,通常称之为Latin-1。Latin-1包括了⾜够的附加字符集来写基本的西欧语⾔。
最后,这个⼈⼈参与的OEM终于以ANSI标准的形式形成⽂件。在ANSI标准中,每个⼈都认同如何使⽤低端的128个编码,这与ASCII相当⼀致。不过,根据所在国籍的不同,处理编码128以上的字符有许多不同的⽅式。这些不同的系统称为代码页。
同时,甚⾄更为令⼈头疼的事情正在逐步上演,亚洲国家的字符表有成千上万个字符,这样的字符表是⽤8位⼆进制⽆法表⽰的。该问题的解决通常有赖于称为DBCS(double byte character set,双字节字符集)的繁杂字符系统。
不过,仍然需要指出⼀点,多数⼈还是姑且认为⼀个字节就是⼀个字符,以及⼀个字符就是8个⼆进制位,并且只要确保不将字符串从⼀台计算机移植到另⼀台计算机,或者说⼀种以上的语⾔,那么这⼏乎总是可以凑合。当然,只要⼀进⼊Internet,从⼀台计算机向另⼀台计算机移植字符串就成为家常便饭了,⽽各种复杂状况也随之呈现出来。令⼈欣慰的是,Unicode随即问世了。
作⽤:表语英语及西欧语⾔。
位数:ASCII是⽤7位表⽰的,能表⽰128个字符;其扩展使⽤8位表⽰,表⽰256个字符。
范围:ASCII从00到7F,扩展从00到FF。
2.iso8859-1
属于单字节编码,最多能表⽰的字符范围是0-255,应⽤于英⽂系列。⽐如,字母'a'的编码为0x61=97。
很明显,iso8859-1编码表⽰的字符范围很窄,⽆法表⽰中⽂字符。但是,由于是单字节编码,和计算机最基础的表⽰单位⼀致,所以很多时候,仍旧使⽤iso8859-1编码来表⽰。⽽且在很多协议上,默认使⽤该编码。⽐如,虽然"中⽂"两个字不存在iso8859-1编码,以
gb2312编码为例,应该是"d6d0 cec4"两个字符,使⽤iso8859-1编码的时候则将它拆开为4个字节来表⽰:"d6 d0 ce c4"(事实上,在进⾏存储的时候,也是以字节为单位处理的)。⽽如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。很明显,这种表⽰⽅法还需要以另⼀种编码为基础。
作⽤:扩展ASCII,表⽰西欧、希腊语等。
位数:8位,
范围:从00到FF,兼容ASCII字符集。
3. GB码字符集
全称是GB2312-80《信息交换⽤汉字编码字符集基本集》,1980年发布,是中⽂信息处理的国家标准,在⼤陆及海外使⽤简体中⽂的地区(如新加坡等)是强制使⽤的唯⼀中⽂编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK 为基本汉字编码、但兼容⽀持GB2312。
双字节编码
范围:A1A1~FEFE
A1-A9:符号区,包含682个符号
B0-F7:汉字区,包含6763个汉字
4.GB2312字符集
GB2312(1980年)⼀共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围⾼字节从B0-F7,低字节从 A1-FE,占⽤的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312-80中共收录了7545个字符,⽤两个字节编码⼀个字符。每个字符最⾼位为0。GB2312-80编码简称国标码。
GB2312⽀持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
作⽤:国家简体中⽂字符集,兼容ASCII。
位数:使⽤2个字节表⽰,能表⽰7445个符号,包括6763个汉字,⼏乎覆盖所有⾼频率汉字。
范围:⾼字节从A1到F7, 低字节从A1到FE。将⾼字节和低字节分别加上0XA0即可得到编码。
5. GB12345-90字符集
1990年制定了繁体字的编码标准GB12345-90《信息交换⽤汉字编码字符集第⼀辅助集》,⽬的在于规范必须使⽤繁体字的各种场合,以及古籍整理等。该标准共收录6866个汉字(⽐GB2312多103个字,其它⼚商的字库⼤多不包括这些字),纯繁体的字⼤概有2200余个。
双字节编码
范围:A1A1~FEFE
A1-A9:符号区,增加竖排符号
B0-F9:汉字区,包含6866个汉字
6.GBK字符集
GBK编码(Chinese Internal Code Specification)是中国⼤陆制订的、等同于UCS的新的中⽂编码扩展国家标准。gbk编码能够⽤来同时表⽰繁体字和简体字,⽽gb2312只能表⽰简体字,gbk是兼容gb2312编码的。GBK⼯作⼩组于1995年10⽉,同年12⽉完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于⼀库。Windows95/98简体中⽂版的字库表层编码就采⽤的是GBK,通过GBK与UCS之间⼀⼀对应的码表与底层字库联系。
英⽂名:Chinese Internal Code Specification
中⽂名:汉字内码扩展规范1.0版
双字节编码,GB2312-80的扩充,在码位上和GB2312-80兼容
范围:8140~FEFE(剔除xx7F)共23940个码位
包含21003个汉字,包含了ISO/IEC 10646-1中的全部中⽇韩汉字
作⽤:它是GB2312的扩展,加⼊对繁体字的⽀持,兼容GB2312。
位数:使⽤2个字节表⽰,可表⽰21886个字符。
范围:⾼字节从81到FE,低字节从40到FE。
7. BIG5字符集
是⽬前台湾、⾹港地区普遍使⽤的⼀种繁体汉字的编码标准,包括440个符号,⼀级汉字5401个、⼆级汉字7652个,共计13060个汉字。BIG5⼜称⼤五码或五⼤码,1984年由台湾财团法⼈信息⼯业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、⼤众 (FIC)创⽴,故称⼤五码。Big5码的产⽣,是因为当时台湾不同⼚商各⾃推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另⼀⽅⾯,台湾政府当时尚未推出官⽅的汉字编码,⽽中国⼤陆的GB2312编码亦未有收录繁体中⽂字。
Big5字符集共收录13,053个中⽂字,该字符集在使⽤。耐⼈寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。
Big5码使⽤了双字节储存⽅法,以两个字节来编码⼀个字。第⼀个字节称为“⾼位字节”,第⼆个字节称为“低位字节”。⾼位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。
尽管Big5码内包含⼀万多个字符,但是没有考虑社会上流通的⼈名、地名⽤字、⽅⾔⽤字、化学及⽣物科等⽤字,没有包含⽇⽂平假名及⽚假字母。
例如台湾视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的⼀些部⾸⽤字(如“⼇”、“⽧”、“⾡”、“⽨”等)、常见的⼈名⽤字(如“堃”、“煊”、“栢”、“喆”等) 也没有收录到Big5之中。
作⽤:统⼀繁体字编码。
位数:使⽤2个字节表⽰,表⽰13053个汉字。
范围:⾼字节从A1到F9,低字节从40到7E,A1到FE。
8.GB18030字符集
GB 18030-2000全称是《信息技术信息交换⽤汉字编码字符集基本集的扩充》,由信息产业部和原国家质量技术监督局于2000年3⽉17⽇联合发布,作为国家强制性标准⾃发布之⽇起实施。
为了适应信息处理技术快速发展的需要,1998年10⽉,由信息产业部电⼦四所、北京⼤学计算机技术研究所、北⼤⽅正集团、新天地公司、四通新世纪公司、中科院软件所、长城软件公司、中软总公司、⾦⼭软件公司和联想公司的技术⼈员组成标准起草组。在标准研制过程中,全国信息技术标准化技术委员会多次召集标准起草组和知名公司对标准草案进⾏充分地研究论证,并且特邀了微软公司、惠普公司、Sun公司和IBM公司等参加,⼴泛征求意见。标准起草组经过反复斟酌和验证,提出了标准制定原则——与GB 2312信息处理交换码所对应的事实上的内码标准兼容,在字汇上⽀持GB 13000.1的全部中、⽇、韩(CJK)统⼀汉字字符和全部CJK扩充A的字符,并且确定了编码体系和27484个汉字,形成兼容性、扩展性、前瞻性兼备的⽅案。
该标准采⽤单字节、双字节和四字节三种⽅式对字符编码。
作⽤:它解决了中⽂、⽇⽂、朝鲜语等的编码,兼容GBK。
位数:它采⽤变字节表⽰(1 ASCII,2,4字节)。可表⽰27484个⽂字。
范围:1字节从00到7F; 2字节⾼字节从81到FE,低字节从40到7E和80到FE;4字节第⼀三字节从81到FE,第⼆四字节从30到39。
9.通⽤字符集(UCS)字符集
ISO/IEC 10646-1 [ISO-10646]定义了⼀种多于8⽐特字节的字符集,称作通⽤字符集(UCS),它包含了世界上⼤多数可书写的字符系统。已定义了两种多8⽐特字节编码,对每⼀个字符采⽤四个8⽐特字节编码的称为UCS-4,对每⼀个字符采⽤两个8⽐特字节编码的称为UCS-2。它们仅能够对UCS的前64K字符进⾏编址,超出此范围的其它部分当前还没有分配编址。
作⽤:国际标准 ISO 10646 定义了通⽤字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。
范围:⽬前,UCS-4只是在UCS-2前⾯加了0x0000。
10.Unicode字符集
Unicode字符集(简称为UCS),国际标准组织于1984年4⽉成⽴ISO/IEC JTC1/SC2/WG2⼯作组,针对各国⽂字、符号进⾏统⼀性编码。1991年美国跨国公司成⽴Unicode Consortium,并于1991年10⽉与WG2达成协议,采⽤同⼀编码字集。⽬前Unicode是采⽤16位编码体系,其字符集内容与ISO10646的BMP(Basic Multilingual Plane)相同。Unicode于1992年6⽉通过DIS(Draf International Standard),⽬前版本V2.0于1996公布,内容包含符号6811个,汉字20902个,韩⽂拼⾳11172个,造字区6400个,保留20249个,共计65534个。Unicode编码后的⼤⼩是⼀样的.例如⼀个英⽂字母 "a" 和 ⼀个汉字 "好",编码后都是占⽤的空间⼤⼩是⼀样的,都是两个字节!
Unicode可以⽤来表⽰所有语⾔的字符,⽽且是定长双字节(也有四字节的)编码,包括英⽂字母在内。所以可以说它是不兼容
iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前⾯增加了⼀个0字节,⽐如字
母'a'为"00 61"。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),⽽unicode⼜可以⽤来表⽰所有字符,所以在很多软件内部是使⽤unicode编码来处理的,⽐如java。
UNICODE字符集有多个编码⽅式,分别是UTF-8,UTF-16,UTF-32和UTF-7编码。
UTF-8
UTF:UCS Transformation Format.考虑到unicode编码不兼容iso8859-1编码,⽽且容易占⽤更多的空间:因为对于英⽂字
母,unicode也需要两个字节来表⽰。所以unicode不便于传输和存储。因此⽽产⽣了utf编码,utf编码兼容iso8859-1编码,同时也可以⽤来表⽰所有语⾔的字符,不过,utf编码是不定长编码,每⼀个字符的长度从1-6个字节不等。另外,utf编码⾃带简单的校验功能。⼀般来讲,英⽂字母都是⽤⼀个字节表⽰,⽽汉字使⽤三个字节。
注意,虽然说utf是为了使⽤更少的空间⽽使⽤的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使⽤GB2312/GBK⽆疑是最节省的。不过另⼀⽅⾯,值得说明的是,虽然utf编码对汉字使⽤3个字节,但即使对于汉字⽹页,utf编码也会⽐unicode编码节省,因为⽹页中包含了很多的英⽂字符。
UTF8编码后的⼤⼩是不⼀定,例如⼀个英⽂字母"a" 和 ⼀个汉字 "好",编码后占⽤的空间⼤⼩就不样了,前者是⼀个字节,后者是三个字节!编码的⽅法是从低位到⾼位。黄⾊为标志位其它着⾊为了显⽰其,编码后的位置。
UTF-16
采⽤2字节,Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。从 0x0000到0x007F是ASCII字符,从
0x0080到0x00FF是ISO-8859-1对ASCII的扩展。希腊字母表使⽤从0x0370到0x03FF 的代码,斯拉夫语使⽤从0x0400到0x04FF 的代码,美国使⽤从0x0530到0x058F的代码,希伯来语使⽤从0x0590到0x05FF的代 码。中国、⽇本和韩国的象形⽂字(总称为CJK)占⽤了从0x3000到0x9FFF的代码;
由于0x00在c语⾔及操作系统⽂件名等中有特殊意义,故很多情况下需要UTF-8编码保存⽂本,去掉这个0x00。举例如下:
UTF-16: 0x0080 = 0000 0000 1000 0000
UTF-8: 0xC280 = 1100 0010 1000 0000
UTF-32
采⽤4字节。
UTF-7
A Mail-Safe Transformation Format of Unicode(RFC1642)。这是⼀种使⽤ 7 位 ASCII 码对 Unicode 码进⾏转换的编码。它的设计⽬的仍然是为了在只能传递 7 为编码的邮件⽹关中传递信息。 UTF-7 对英语字母、数字和常见符号直接显⽰,⽽对其他符号⽤修正的Base64 编码。符号 + 和 - 号控制编码过程的开始和暂停。所以乱码中如果夹有英⽂单词,并且相伴有 + 号和 - 号,这就有可能是 UTF-7编码。
作⽤:为世界650种语⾔进⾏统⼀编码,兼容ISO-8859-1。
位数:UNICODE字符集有多个编码⽅式,分别是UTF-8,UTF-16和UTF-32。
优缺点:
· UTF-8、UTF-16和UTF-32都可以表⽰有效编码空间 (U+000000-U+10FFFF) 内的所有Unicode字符。
· 使⽤UTF-8编码时ASCII字符只占1个字节,存储效率⽐较⾼,适⽤于拉丁字符较多的场合以节省空间。
· 对于⼤多数⾮拉丁字符(如中⽂和⽇⽂)来说,UTF-16所需存储空间最⼩,每个字符只占2个字节。
· Windows NT内核是Unicode(UTF-16),采⽤UTF-16编码在调⽤系统API时⽆需转换,处理速度也⽐较快。
· 采⽤UTF-16和UTF-32会有Big Endian和Little Endian之分,⽽UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。
· UTF-32采⽤4字节编码,⼀⽅⾯处理速度⽐较快,但另⼀⽅⾯也浪费了⼤量空间,影响传输速度,因⽽很少使⽤。
很多⼈以为UTF-8等和Unicode都是字符集或都是编码⽅式,其实这是误区。
到以上为⽌,⼤部分常⽤的字符集已经基本列举完毕,再看⼀些其他的编码⽅式:
MIME 编码
MIME 是“多⽤途⽹际邮件扩充协议”的缩写,在 MIME 协议之前,邮件的编码曾经有过 UUENCODE 等编码⽅式 ,但是由于MIME 协议算法简单,并且易于扩展,现在已经成为邮件编码⽅式的主流,不仅是⽤来传输 8 bit 的字符,也可以⽤来传送⼆进制的⽂件 ,如邮件附件中的图像、⾳频等信息,⽽且扩展了很多基于MIME 的应⽤。从编码⽅式来说,MIME 定义了两种编码⽅法Base64与
QP(Quote-Printable)
Base64
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计⽤来把任意序列的8位字节描述为⼀种不易被⼈直接识别的形式。
为什么要使⽤Base64?
在设计这个编码的时候,我想设计⼈员最主要考虑了3个问题:
1.是否加密?
2.加密算法复杂程度和效率
3.如何处理传输?
加密是肯定的,但是加密的⽬的不是让⽤户发送⾮常安全的Email。这种加密⽅式主要就是“防君⼦不防⼩⼈”。即达到⼀眼望去完全看不出内容即可。
基于这个⽬的加密算法的复杂程度和效率也就不能太⼤和太低。和上⼀个理由类似,MIME协议等⽤于发送Email的协议解决的是如何收发Email,⽽并不是如何安全的收发Email。因此算法的复杂程度要⼩,效率要⾼,否则因为发送Email⽽⼤量占⽤资源,路就有点⾛歪了。
但是,如果是基于以上两点,那么我们使⽤最简单的恺撒法即可,为什么Base64看起来要⽐恺撒法复杂呢?这是因为在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即⼀个8位字节的低7位。因此,如果您发送了⼀封带有⾮ASCII字符(即字节的最⾼位是1)的Email通过有“历史问题”的⽹关时就可能会出现问题。⽹关可能会把最⾼位置为0!很明显,问题就这样产⽣了!因此,为了能够正常的传送Email,这个问题就必须考虑!所以,单单靠改变字母的位置的恺撒之类的⽅案也就不⾏了。关于这⼀点可以参考
RFC2046。
基于以上的⼀些主要原因产⽣了Base64编码。
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前⾯补两个0,形成8位⼀个字节的形式。
QP(Quote-Printable)
通常缩写为“Q”⽅法,其原理是把⼀个 8 bit 的字符⽤两个16进制数值表⽰,然后在前⾯加“=”。所以我们看到经过QP编码后的⽂件通常是这个样⼦:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。
最后,我们希望你看了这篇⽂章之后不要混淆字符集和字符编码的概念,还有对以上谈到的各种编码⽅式的原因有⼤致的了解,象
utf-8这类是为了解析unicode这种字符集⽽制定,⽽base64这类是为了解决实际的⽹络应⽤⽽制定。为了让你便于记忆,对先前介绍的字符集进⾏统计和分类:
语⾔ 字符集 正式名称
英语、西欧语 ASCII,ISO-8859-1 MBCS 多字节
简体中⽂ GB2312 MBCS 多字节
unicode编码转换二进制繁体中⽂ BIG5 MBCS 多字节
简繁中⽂ GBK MBCS 多字节
中⽂、⽇⽂及朝鲜语 GB18030 MBCS 多字节
各国语⾔ UNICODE,UCS DBCS 宽字节
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论