字符ascii码值转换_字符、字符集、字符编码的基础知识科普
这篇⽂章主要介绍三个问题:ascii共有多少个字符
这篇⽂章主要介绍三个问题:
1、什么是字符、字符集、字符编码,他们的区别区别是什么?
2、什么是UTF-8、UTF-16、UTF-32,他们的区别是什么?
3、什么是GB2312、GBK、GB18030,他们的区别是什么?
⼀、编码基本概念
1. 字符
字符(Character):在计算机和电信技术中,⼀个字符是⼀个单位的字形、类字形单位或符号的基本信息。说的简单点字符是各种⽂字和符号的总称。⼀个字符可以是⼀个中⽂汉字、⼀个英⽂字母、⼀个阿拉伯数字、⼀个标点符号、⼀个图形符号或者控制符号等。
2. 字符集
字符集(Character Set):是指多个字符的集合。不同的字符集包含的字符个数不⼀样、包含的字符不⼀样、对字符的编码⽅式也不⼀样。例如GB2312是中国国家标准的简体中⽂字符集,GB2312收录简化汉字(6763个)及⼀般符号、序号、数字、拉丁字母、⽇⽂假名、希腊字母、俄⽂字母、汉语拼⾳符号、汉语注⾳字母,共 7445 个图形字符。⽽ASCII字符集只包含了128字符,这个字符集收录的主要字符是英⽂字母、阿拉伯字母和⼀些简单的控制字符。
另外,还有其他常⽤的字符集有 GBK字符集、GB18030字符集、Big5字符集、Unicode字符集等。
3. 字符编码
字符编码(Character Encoding):字符编码是指⼀种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。例如ASCII字符编码规定使⽤单字节中低位的7个⽐特去编码所有的字符,在这个编码规则下字母A的编号是65(ASCII 码),⽤单字节表⽰就是0x41,
因此写⼊存储设备的时候就是⼆进制的 01000001。每种字符集都有⾃⼰的字符编码规则,常⽤的字符集编码规则还有 UTF-8编码、GBK编码、Big5编码等。
4. 码点
码点(Code Point):有些地⽅翻译为码值或内码。是指在某个字符集中,根据某种编码规则将字符编码后得到的值。⽐如在ASCII字符集中,字母A经过ASCII编码得到的值是65,那么65就是字符A在ASCII字符集中的码点。
总结:通俗解释字符集就是把字符放到⼀起的⼀个集合。⽽这个集合的每⼀个字符都对应⼀个数字,叫做码点。那么,这样就建⽴起 总结:
来数字和字符之间的索引关系。那么,某个字符在计算机中怎么表⽰,具体占⽤⼏个字节等等,这些就需要编码规则来解决了。这个就是字符编码,他来解决根据某个规则来将字符映射到相应的码点上⾯。
⼆、字符集和字符编码
ASCII字符集
上个世纪60年代,美国制定了⼀套字符编码规则,对英语字符与⼆进制位之间的关系做了统⼀规定,这编码规则被称为ASCII编码,⼀直沿⽤⾄今。
ASCII编码⼀共规定了128个字符的编码规则,这128个字符形成的集合就叫做ASCII字符集。在ASCII编码中,每个字符占⽤⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。在ASCII编码中,0~31 是控制字符如换⾏回车删除等,32~126 是可打印字符,可以通过键盘输⼊并且能够显⽰出来。(下图是ASCII字符集中字符和码值的对应关系)
英语⽤128个符号编码就够了,但是⽤来表⽰其他语⾔,128个符号是不够的。所以当ASCII码到欧洲的时候,⼀些欧洲国家就决定对ASCII编码进⾏适当的“改造”:利⽤字节中闲置的最⾼位编⼊新的符号。⽐如,法语中的é的编码为130(⼆进制10000010)。这样⼀来,这些欧洲国家使⽤的编码体系,可以表⽰最多256个符号。这个编码统称为EASCII(Extended ASCII)。
但是欧洲的语⾔体系有个特点:⼩国家特别多,每个国家可能都有⾃⼰的语⾔体系,语⾔环境⼗分复杂。因此即使EASCII可以表⽰256个字符,也不能统⼀欧洲的语⾔环境。
为了解决上⾯这个问题,⼈们想出了⼀个折中的⽅案:在EASCII中表⽰的256个字符中,前128字符和
ASCII编码表⽰的字符完全⼀样,后128个字符每个国家或地区都有⾃⼰的编码标准。⽐如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中⼜会代表另⼀个符号。但是不管怎样,所有这些编码⽅式中,0—127表⽰的符号是⼀样的,不⼀样的只是128—255的这⼀段。
根据这个规则,就形成了很多⼦标准:ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。这些⼦标准适⽤于欧洲不同的国家地区。具体关于ISO-8859的标准请参考这个链接。这边我摘录了部分介绍。
ISO8859-1 字符集,也就是 Latin-1,是西欧常⽤字符,包括德法两国的字母。
ISO8859-2 字符集,也称为 Latin-2,收集了东欧字符。
ISO8859-3 字符集,也称为 Latin-3,收集了南欧字符。
⾄于亚洲国家的⽂字,使⽤的符号就更多了,汉字就多达10万左右。⼀个字节最多只能表⽰256种符号,肯定是不够的,必须使⽤多个字节表达⼀个符号,因此才出现了后⾯的Unicode字符集和GB2312等字符集。⽐如,简体中⽂常见的编码⽅式是GB2312,使⽤两个字节表⽰⼀个汉字,所以理论上最多可以表⽰65536个符号。
总结:ASCII码是美国制定的⼀套字符集,⾥⾯包含128个字符(2^7)所有只⽤了7位,最后⼀位默认
赋值0,但是在⼀些欧洲国家为了满⾜特殊符号需求,就把最后⼀位也⽤上了就多出来了128个字符(2^8)。个⼈理解:ASCII码应该只是字符集,⽽不是字符编码,或者曾经是字符编码,现在⼤家都是⼴义上⾯说ASCII编码。
Unicode字符集
ASCII码字符集,总共才能容纳256个字符,对于全世界各国语⾔来说,很难全部包含在内,所有后来就出现了Unicode字符集。
Unicode字符集是⼀个很⼤的字符集合,现在的规模可以容纳100多万个符号。每个符号的编码都不⼀样,⽐如,U+0639表⽰阿拉伯字母Ain,U+0041表⽰英语的⼤写字母A,U+4E25表⽰汉字“严”。
需要注意的是,Unicode只是⼀个字符集,它只规定了符号的⼆进制代码,却没有规定这个⼆进制代码应该如何编码如何存储。这就造成了两个问题:
第⼀个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表⽰⼀个符号,⽽不是分别表⽰三个符号呢?
第⼆个问题是,我们已经知道,英⽂字母只⽤⼀个字节表⽰就够了,如果unicode统⼀规定,每个符号⽤三个或四个字节表⽰,那么每个英⽂字母前都必然有⼆到三个字节是0,这对于存储来说是极⼤的浪
费,⽂本⽂件的⼤⼩会因此⼤出⼆三倍,这是⽆法接受的。
为了解决Unicode字符集存在的问题,就出现了UTF(Unicode Transformation Formats)系列的编码规则。UTF编码规则具体规定了Unicode字符集中的字符是如何编码的。
总结:
总结:Unicode是⼀个很⼤的字符集,这个字符集只规定了这个字符集中每个字符对应的码值是多少,但是这个字符集并没有规定具体的编码规则,具体的编码规则有UTF系列的编码规则实现。
下⾯我们就来看看UTF系列编码的具体实现。
UTF-8编码
互联⽹的普及,强烈要求出现⼀种统⼀的编码⽅式。UTF-8就是在互联⽹上使⽤最⼴的⼀种Unicode的实现⽅式。其他实现⽅式还包括UTF-16和UTF-32,不过在互联⽹上基本不⽤。重复⼀遍,这⾥的关系是:UTF-8编码是Unicode的实现⽅式之⼀。
UTF-8(8-bit Unicode Transformation Format)是⼀种针对Unicode的可变长度字符编码规则,⼜称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8⽤1到4个字节编码Unicode字符。⽤在⽹页上可以统⼀页⾯显⽰中⽂简体繁体及其它语⾔(如英⽂,⽇⽂,韩⽂)。
UTF-8最⼤的⼀个特点,就是它是⼀种变长的编码⽅式。它可以使⽤1~4个字节表⽰⼀个符号,根据不同的符号⽽变化字节长度(UTF-8编码可以容纳2^21个字符,总共200多万个字符)。
UTF-8的编码规则很简单,只有⼆条:
1. 对于单字节的符号,字节的第⼀位设为0,后⾯7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2. 对于n字节的符号(n>1),第⼀个字节的前n位都设为1,第n+1位设为0,后⾯字节的前两位⼀律设为10。剩下的没有提及的⼆进
制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表⽰可⽤编码的位。
Unicode符号范围 | UTF-8编码⽅式
UTF字节数 (⼗六进制) | (⼆进制)
⼀个字节 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编码。
已知“严”的unicode是u4E25(100111000100101),根据上表,可以发现4E25处在第三⾏的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后⼀个⼆进制位开始,依次从后向前填⼊格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成⼗六进制就是E4B8A5。
UTF8、UTF16和UTF32之间的区别
再次强调⼀个概念:就是Unicode是⼀个字符集,这个字符集世界上所有的字符定义了⼀个唯⼀编码。其仅仅规定了每个符号的⼆进制代码,没有制定细化的存储规则。UTF-8、UTF-16、UTF-32才是Unicode的存储格式定义。上⾯已经简单介绍了UTF8编码规则,那么这个规则和UTF16、UTF32等规则有什么区别呢?
UCS-2和UCS-4
在将UTF8和UTF16、UTF32的区别之前,再先科普两个名词:UCS-2和UCS-4。
Unicode是为整合全世界的所有语⾔⽂字⽽诞⽣的。任何⽂字在Unicode中都对应⼀个值, 这个值称为代码点(code point,也称码值)。代码点的值通常写成 U+ABCD 的格式。⽽⽂字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是⽤两个字节来表⽰代码点,其取值范围为 U+0000~U+FFFF。
为了能表⽰更多的⽂字,⼈们⼜提出了UCS-4,即⽤四个字节表⽰代码点。它的范围为 U+00000000~U+7FFFFFFF,其中
U+00000000~U+0000FFFF和UCS-2是⼀样的。
要注意,UCS-2和UCS-4只规定了代码点和⽂字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储⽅式的称为
UTF(Unicode Transformation Format),也就是我们上⾯提到的UTF8格式和下⾯将要提到的UTF16、UTF32格式。
UTF-16编码格式
UTF-16由RFC2781规定,它使⽤两个字节来表⽰⼀个代码点。不难猜到,UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian⽅式直接保存下来。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian)和UTF-16LE(Little Endian)。UTF-16BE和UTF-16LE不难理解,⽽UTF-16就需要通过在⽂件开头以名为BOM(Byte Order Mark)的字符来表明⽂件是Big Endian还是Little Endian。BOM为U+FEFF这个字符。其实BOM是个⼩聪明的想法。由于UCS-2没有定义U+FEFF,因此只要出现FF FE 或者 FE FF 这样的字节序列,就可以认为它是U+FEFF,并且可以判断出是Big Endian还是Little Endian。
BOM(Byte Order Mark)⽤来放在⽂档的开头告诉阅读器该⽂档的字节序。UTF-8不需要BOM来表明字节顺序,但可以⽤BOM来表明编码⽅式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。UTF-16才需要加BOM。因为它是按Unicode 顺序编码,在BMP范围内是⼆字节,需要识别是⼤或⼩字节序。
这边顺便科普下⼤⼩端的概念。
低字节序(Little Endian)和⾼字节序(Big Endian)
低字节序和⾼字节序只是⼀个关于在内存中存储和读取⼀段字节(被称作words)的约定。这意味着当你让计算机⽤UTF-16把字母A(占两个字节)存在内存中时,使⽤哪种字节序⽅案决定了你把第⼀个字节放在第⼆个字节的前⾯还是后⾯。这么说有点不太容易懂,让我们来看⼀个例⼦:当你使⽤UTF-16存下某段内容时,在不同的系统中它的后半部分可能是这样的:
00 68 00 65 00 6C 00 6C 00 6F(⾼字节序,⾼位字节被存在前⾯)
68 00 65 00 6C 00 6C 00 6F 00(低字节序,低位字节被存在前⾯)
字节序⽅案只是⼀个微处理器架构设计者的偏好问题,例如,Intel使⽤低字节序,Motorola使⽤⾼字节序。
举个例⼦。“ABC”这三个字符⽤各种⽅式编码后的结果如下:
UTF-32
UTF-32⽤四个字节表⽰代码点,这样就可以完全表⽰UCS-4的所有代码点,⽽⽆需像UTF-8那样使⽤复杂的算法。 与UTF-16类
似,UTF-32也包括UTF-32、UTF-32BE、UTF-32LE三种编码,UTF-32也同样需要BOM字符。
⽂本编辑器怎么知道⽂本的编码
当⼀个软件打开⼀个⽂本时,它要做的第⼀件事是决定这个⽂本究竟是使⽤哪种字符集的哪种编码保存的。软件⼀般采⽤三种⽅式来决定⽂本的字符集和编码:
1.检测⽂件头标识(BOM)
EF BB BF UTF-8
FE FF UTF-16/UCS-2, big endian
FF FE UTF-16/UCS-2, little endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
2.软件⾃⼰根据编码规则猜测当前⽂件的编码
3.提⽰⽤户⾃⼰输⼊当前⽂件的编码
总结:UTF-8、UTF-16、UTF-32只是⼀种编码格式,不是字符集,是⽤来规范字符集存储⽤的。其中UTF-8是变成的编码规范, 总结:
⽽UTF-16是固定⽤两个字节表⽰⼀个码值,UTF-32是固定使⽤四个字节表⽰⼀个码值。
GB2312、GBK、GB18030之间的区别
GB2312编码是第⼀个汉字编码国家标准,是由中国国家标准总局1980年发布,1981年5⽉1⽇开始实施的⼀套国家标准,标准号是
GB2312—1980。GB2312编码适⽤于汉字处理、汉字通信等系统之间的信息交换,通⾏于中国⼤陆;新加坡等地也采⽤此编码。中国⼤陆⼏乎所有的中⽂系统和国际化的软件都⽀持GB2312。GB2312编码共收录汉字6763个,其中⼀级汉字3755个,⼆级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、⽇⽂平假名及⽚假名字母、俄语西⾥尔字母在内的682个全⾓字符。
GB2312是对ASCll码的扩展,占⽤两个字节。具体的编码规则这边就不介绍了,感兴趣的读者可以参考这篇博客。
GB2312能表⽰的汉字只有6000多个,但是中国的汉字有10万之多,所以GB2312字符集还是不够⽤,于是GBK出现了。GBK是对
GB1212的扩展,也是占⽤2个字节,GBK不再要求低字节⼀定是127号之后的内码,只要第⼀个字节是⼤于127就固定表⽰这是⼀个汉字的开始,不管后⾯跟的是不是扩展字符集⾥的内容。GBK 包括了 GB2312 的所有内容,同时⼜增加了近20000个新的汉字(包括繁体字)和符号。
GB18030采⽤变长编码,可以是1个字节、2个字节和4个字节。是对GB2312和GBK的扩展,完全兼容两者。
通过上⾯介绍,可以发现GBK、GB2312和GB18030字符集主要是对中⽂汉字的编码,同时兼顾了⼀些其他常⽤符号的编码。其中:
GB2312编码⽅案出现最早,占⽤2个字节,但是能表⽰的字符较少;
GBK也占⽤2个字节,采⽤了不同的编码⽅式,对GB2312进⾏了扩展,增加了近20000个新的汉字(包括繁体字)和符号;
GB18030采⽤变长编码,可以是1个字节、2个字节和4个字节。是对GB2312和GBK的扩展,完全兼容两者。
总结:
总结:GB2312是我们中⽂⾃⼰的字符集,是国家标准。由于不能包含全部汉字,后⾯有扩展出现了GBK,GBK是固定长度编码的字符集,后⾯⼜出现了变长编码的GB18030字符集。
by 2020-09-28 周⼀ 晚上

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。