常⽤的编码简介及windows下.txt编码识别⽅法
1、ASCII 字符集
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于罗马字母表的⼀套电脑编码系统,它主要⽤于显⽰现代英语和其他西欧语⾔。它是现今最通⽤的单字节编码系统,并等同于国际标准ISO 646。
包含内容:
控制字符:回车键、退格、换⾏键等。
可显⽰字符:英⽂⼤⼩写字符、阿拉伯数字和西⽂符号
ASCII扩展字符集扩展:表格符号、计算符号、希腊字母和特殊的拉丁符号。
字符排布:
第0~32号及第127号(共34个)
是控制字符或通讯专⽤字符,如控制符:LF(换⾏)、CR(回车)、FF(换页)、DEL(删除)、BE
L(振铃)等;通讯专⽤字符:SOH(⽂头)、EOT(⽂尾)、ACK(确认)等;
第33~126号(共94个)
是字符
48~57号为0~9⼗个阿拉伯数字;
65~90号为26个⼤写英⽂字母;
97~122号为26个⼩写英⽂字母;
其余为⼀些标点符号、运算符号等。
注意:
在计算机的存储单元中,⼀个ASCII码值占⼀个字节(8个⼆进制位),其最⾼位(b7)⽤作奇偶校验位。
所谓奇偶校验,是指在代码传送过程中⽤来检验是否出现错误的⼀种⽅法,⼀般分奇校验和偶校验两种。
奇校验规定:正确的代码⼀个字节中1的个数必须是奇数,若⾮奇数,则在最⾼位b7添1;偶校验规定:正确的代码⼀个字节中1的个数必须是偶数,若⾮ 偶数,则在最⾼位b7添1。
2、ANSI编码
GB2312 字符集
GB2312⼜称为GB2312-80字符集,全称为《信息交换⽤汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5⽉1⽇实施,是中国国家标准的简体中⽂字符集。它所收录的汉字已经覆盖99.75%的使⽤频率,基本满⾜了汉字的计算机处理需要。在中国⼤陆和新加坡获⼴泛使⽤。
GB2312收录简化汉字及⼀般符号、序号、数字、拉丁字母、⽇⽂假名、希腊字母、俄⽂字母、汉语拼⾳符号、汉语注⾳字母,共 7445个图形字符。其中包括6763个汉字,其中⼀级汉字3755个,⼆级汉字3008个;包括拉丁字母、希腊字母、⽇⽂平假名及⽚假名字母、俄语西⾥尔字母在内的682个全⾓字符。
GB2312中对所收汉字进⾏了“分区”处理,每区含有94个汉字/符号。这种表⽰⽅式也称为区位码。
它是⽤双字节表⽰的,两个字节中前⾯的字节为第⼀字节,后⾯的字节为第⼆字节。习惯上称第⼀字节为“⾼字节” ,⽽称第⼆字节
为“低字节”。“⾼位字节”使⽤了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使⽤了0xA1-0xFE(把01-94加上
0xA0)。
以GB2312字符集的第⼀个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在⼤多数计算机程序中,⾼字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。
GBK字符集
GBK字符集是GB2312的扩展(K),GBK1.0收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。GBK字符集主要扩展了繁体中⽂字的⽀持。
BIG5 字符集
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之中。
GB18030 字符集
GB18030的全称是GB18030-2000《信息交换⽤汉字编码字符集基本集的扩充》,是我国政府于2000年3⽉17⽇发布的新的汉字编码国家标准,2001年8⽉31⽇后在中国市场上发布的软件必须符合本标准。GB 18030字符集标准的出台经过⼴泛参与和论证,来⾃国内外知名信息技术⾏业的公司,信息产业部和原国家质量技术监督局联合实施。
GB 18030字符集标准解决汉字、⽇⽂假名、朝鲜语和中国少数民族⽂字组成的⼤字符集计算机编码问
题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中⽂、⽇⽂、朝鲜语和中国少数民族⽂字。满⾜中国⼤陆、⾹港、台湾、⽇本和韩国等东亚地区信息交换多⽂种、⼤字量、多⽤途、统⼀编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统⼀汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。
编码⽅法:
GB 18030标准采⽤单字节、双字节和四字节三种⽅式对字符编码。单字节部分使⽤0×00⾄0×7F码(对应于ASCII码的相应码)。双字节部分,⾸字节码从0×81⾄0×FE,尾字节码位分别是0×40⾄0×7E和0×80⾄0×FE。四字节部分采⽤GB/T 11383未采⽤的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第⼀、三个字节编码码位均为0×81⾄0×FE,第⼆、四个字节编码码位均为0×30⾄0×39。
按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。
接着是国际通⽤的unicode字符集
Unicode字符集(简称为UCS)
名称的由来
Unicode字符集编码是(Universal Multiple-Octet Coded Character Set) 通⽤多⼋位编码字符集的简称,⽀持世界上超过650种语⾔的国际字符集。Unicode允许在同⼀服务器上混合使⽤不同语⾔组的不同语⾔。它是由⼀个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,⽀持现今世界各种不同语⾔的书⾯⽂本的交换、处理及显⽰。该编码于1990年开始研
发,1994年正式公布,最新版本是2005年3⽉31⽇的Unicode 4.1.0。Unicode是⼀种在计算机上使⽤的字符编码。它为每种语⾔中的每个字符设定了统⼀并且唯⼀的⼆进制编码,以满⾜跨语⾔、跨平台进⾏⽂本转换、处理的要求。
编码⽅法
Unicode 标准始终使⽤⼗六进制数字,⽽且在书写时在前⾯加上前缀“U+”,例如字母“A”的编码为 004116 。所以“A”的编码书写为“U+0041”。
UTF-8 编码
UTF-8是Unicode的其中⼀个使⽤⽅式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。
UTF-8便于不同的计算机之间使⽤⽹络传输不同语⾔和编码的⽂字,使得双字节的Unicode能够在现存
的处理单字节的系统上正确传输。UTF-8使⽤可变长度字节来储存 Unicode字符,例如ASCII字母继续使⽤1字节储存,重⾳⽂字、希腊字母或西⾥尔字母等使⽤2字节来储存,⽽常⽤的汉字就要使⽤3字节。辅助平⾯字符则使⽤4字节。
UTF-16 和 UTF-32 编码
UTF-32、UTF-16 和 UTF-8 是 Unicode 标准的编码字符集的字符编码⽅案,UTF-16 使⽤⼀个或两个未分配的 16 位代码单元的序列对Unicode 代码点进⾏编码;UTF-32 即将每⼀个 Unicode 代码点表⽰为相同值的 32 位整数
通过⼀个问题了解unicode编码
解惑:
UNICODE 与 UTF8、UTF16
由于每种语⾔都制定了⾃⼰的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集⾮常不便。因此,产⽣了Unicode字符集,它固定使⽤16 bits(两个字节)来表⽰⼀个字符,共可以表⽰65536个字符
标准的 Unicode 称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使⽤类似MBCS的⽅式对Unicode进⾏编码。(Unicode字符集有多种编码形式)。 例如"连通"两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90 ⽽其UTF-8编码为:E8 BF 9E E9 80 9A
同样是txt⽂件,Windows怎样识别编码⽅式的呢?
问题:使⽤Windows记事本的“另存为”,可以在ANSI、GBK、Unicode、Unicode big endian和UTF-8这⼏种编码⽅式间相互转换。同样是txt⽂件,Windows怎样识别编码⽅式的呢?
我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt⽂件的开头会多出⼏个字节,分别是FF、FE(Unicode),FE、
FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?
当⼀个软件打开⼀个⽂本时,它要做的第⼀件事是决定这个⽂本究竟是使⽤哪种字符集的哪种编码保存的。
软件⼀般采⽤三种⽅式来决定⽂本的字符集和编码:1) 检测⽂件头标识;2)提⽰⽤户选择;3)根据⼀定的规则猜测 。
最标准的途径是检测⽂本最开头的⼏个字节,开头字节 Charset/encoding,如下表:
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
注:
1)big endian和little endian
big endian和little endian是CPU处理多字节数的不同⽅式。例如“汉”字的Unicode编码是6C49。那么写到⽂件⾥时,究竟是将6C写在前⾯,还是将49写在前⾯?如果将6C写在前⾯,就是big endian。还是将49写在前⾯,就是little endian。
“endian”这个词出⾃《格列佛游记》。⼩⼈国的内战就源于吃鸡蛋时是究竟从⼤头(Big-Endian)敲开还
是从⼩头(Little-Endian)敲开,由此曾发⽣过六次叛乱,其中⼀个皇帝送了命,另⼀个丢了王位。
我们⼀般将endian翻译成“字节序”,将big endian和little endian称作“⼤尾”和“⼩尾”。
2)字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使⽤的缺省编码⽅式就是计算机的内码。早期的计算机使⽤7位的ASCII编码,为了处理汉字,程序员设计了⽤于简体中⽂的GB2312和⽤于繁体中⽂的big5。二进制编码转换
GB2312(1980年)⼀共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围⾼字节从B0-F7,低字节从A1-FE,占⽤的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312⽀持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏⽂、蒙⽂、维吾尔⽂等主要的少数民族⽂字。现在的PC平台必须⽀持GB18030,对嵌⼊式产品暂不作要求。所以⼿机、MP3⼀般只⽀持GB2312。
从ASCII、GB2312、GBK到GB18030,这些编码⽅法是向下兼容的,即同⼀个字符在这些⽅案中总是有相同的编码,后⾯的标准⽀持更多的字符。在这些编码中,英⽂和中⽂可以统⼀地处理。区分中⽂编码的⽅法是⾼字节的最⾼位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字
符集 (DBCS)。
有的中⽂Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通⼈是很难⽤到的,通常我们还是⽤GBK指代中⽂Windows内码。
这⾥还有⼀些细节:
GB2312的原⽂还是区位码,从区位码到内码,需要在⾼字节和低字节上分别加上A0。
在DBCS中,GB内码的存储格式始终是big endian,即⾼位在前。
GB2312的两个字节的最⾼位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最⾼位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到⾼位为1的字节,就可以将下两个字节作为⼀个双字节编码,⽽不⽤管低字节的⾼位是什么。
3)Unicode、UCS和UTF(UCS Transformation Format)
前⾯提到从ASCII、GB2312、GBK到GB18030的编码⽅法是向下兼容的。⽽Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,⽽GB码是BABA。
UCS规定了怎么⽤多个字节表⽰各种⽂字。⽽怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的!常见的UTF规范包括UTF-8、UTF-7、UTF-16。
4)UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释⼀个UTF-16⽂本前,⾸先要弄清楚每个编码单元的字节序。例如收到⼀个“奎”的Unicode编码是594E,“⼄”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“⼄”?
Unicode规范中推荐的标记字节顺序的⽅法是BOM。BOM不是“Bill Of Material”的BOM表,⽽是Byte Order Mark。BOM是⼀个有点⼩聪明的想法:
在UCS编码中有⼀个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。⽽FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"⼜被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以⽤BOM来表明编码⽅式。字符"ZERO WIDTH NO-BREAK
SPACE"的UTF-8编码是EF BB BF(读者可以⽤我们前⾯介绍的编码⽅法验证⼀下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使⽤BOM来标记⽂本⽂件的编码⽅式的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论