还剩39页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
ASCH、Unicode和UTF-8之间的关系字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识
一、ASCII码我们知道,计算机内部,所有信息最终都是一个二进制值每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定这被称为ASCII码,一直沿用至今ASCII码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000)大写的字母A是65(二进制01000001)这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0
二、非ASCII编码英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号比如,法语中的e的编码为130(二进制10000010)这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号但是,这里又出现了新的问题不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样比如,130在法语编码中代表了6在希伯来语编码中却代表了字母GimelQ)在俄语编码中又会代表另一个符号但是不管怎样,所有这些编码方式中,0-127表示的符号是一样的,不一样的只是128—255的这一段至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号比如,简体中文常见的编码方式是GB2312使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号ASCII打印字符(字符编码32-127)32〜126(共95个)是字符32是空格,其中48〜57为0到9十个阿拉伯数字,65〜90为26个大写英文字母,97〜122号为26个小写英文字母,其余为一些标点符号、运算符号等第127个字符表示的是键盘上的删除命令ASCH扩展码(字符编码128-255)后128个称为扩展ASCH码许多基于x86的系统都支持使用扩展(或高”)ASCIIo扩展ASCII码允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号中文编码的问题需要专文讨论,这篇笔记不涉及这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的三.Unicode正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样可以想象,如果有一种编码,将世界上所有的符号都纳入其中每一个符号都给予一个独一无二的编码,那么乱码问题就会消失这就是Unicode就像它的名字都表示的,这是一种所有符号的编码Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号每个符号的编码都不一样,比如,U+0639表示阿拉伯字母AinU+0041表示英语的大写字母AU+4E25表示汉字严具体的符号对应表,可以查询unicodeorg或者专门的汉字对应表
四、Unicode的问题需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储比如,汉字严的Unicode是十六进制数4E25转换成二进制数足足有15位100111000100101也就是说,这个符号的表示至少需要2个字节表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的它们造成的结果是1出现了Unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示Unicodeo2Unicode在很长一段时间内无法推广,直到互联网的出现
五、UTF-8互联网的普及,强烈要求出现一种统一的编码方式UTF-8就是在互联网上使用最广的一种Unicode的实现方式其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一UTF-8最大的一个特点,就是它是一种变长的编码方式它可以使用「4个字节表示一个符号,根据不同的符号而变化字节长度UTF-8的编码规则很简单,只有二条1)对于单字节的符号,字节的第一位设为0后面7位为这个符号的Unicode码因此对于英语字母,UTF-8编码和ASCII码是相同的2)对于n字节的符号(n1)第一个字节的前n位都设为1第n+1位设为0后面字节的前两位一律设为10剩下的没有提及的二进制位,全部为这个符号的Unicode码下表总结了编码规则,字母X表示可用编码的位Unicode符号范围(十六进制)UTF-8编码方式(二进制)00000000-0000007F00000080-000007FF00000800-0000FFFF00010000-0010FFFFOxxxxxxx1lOxxxxxlOxxxxxx11lOxxxxlOxxxxxxlOxxxxxx111lOxxxlOxxxxxxlOxxxxxxlOxxxxxx跟据上表,解读UTF-8编码非常简单如果一个字节的第一位是0则这个字节单独就是一个字符;如果第一位是1则连续有多少个1就表示当前字符占用多少个字节下面,还是以汉字严为例,演示如何实现UTF-8编码严的Unicode是4E25100111000100101根据上表,可以发现4E25处在第三行的范围内00000800—0000FFFF因此严的utf-8编码需要三个字节,即格式是lllOxxxxlOxxxxxxWxxxxxxo然后,从严的最后一个二进制位开始,依次从后向前填入格式中的x多出的位补0这样就得到了,严的UTF-8编码是111001001011100010100101转换成十六进制就是E4B8A5
六、Unicode与UTF-8之间的转换通过上一节的例子,可以看到严的Unicode码是4E25UTF-8编码是E4B8A5两者是不一样的它们之间的转换可以通过程序实现Windows平台,有一个最简单的转化方法,就是使用内置的记事本小程序notepad.exeo打开文件后,点击文件菜单中的另存为命令,会跳出一个对话框,在最底部有一个编码的下拉条:,Windows10CAppD:PerE:_CoF:_BackupG:一CD驱动器H:NShare\\
192.1工nfs\\
192.
168.-1nfs\\
172.
16.1A班8文件天翁请
⑥:〔ANSIJI|脱肖ANSIUnicodeUnicodebigendianUTF・8里面有四个选项ANSIUnicodeUnicodebigendian和UTF—8□ANSI是默认的编码方式对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Bi3Unicode编码这里指的是notepadexe使用的UCS-2编码方式,即直接用两个字节存入字符的Unicode码,这个选项用的littleendian格式Unicodebigendian编码与上一个选项相对应我在下一节会解释littleendian和bigendian的涵义4)UTF-8编码,也就是上一节谈到的编码方法选择完”编码方式”后,点击“保存”按钮,文件的编码方式就立刻转换好了
七、Littleendian和Bigendian上一节已经提到,UCS-2格式可以存储Unicode码码点不超过OxFFFF以汉字严为例,Unicode码是4E25需要用两个字节存储,一个字节是4E另一个字节是25存储的时候,4E在前,25在后,这就是Bigendian方式;25在前,4E在后,这是Littleendian方式这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头Big-endian敲开还是从小头Little-endian敲开为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位第一个字节在前,就是大头方式Bigendian第二个字节在前就是小头方式Littleendiano那么很自然的,就会出现一个问题计算机怎么知道某一个文件到底采用哪一种方式编码?Unicode规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做零宽度非换行空格zerowidthno-breakspace用FEFF表示这正好是两个字节,而且FF比FE大1如果一个文本文件的头两个字节是FEFF就表示该文件采用大头方式;如果头两个字节是FFFE就表示该文件采用小头方式
八、实例下面,举一个实例打开“记事本程序notepad.exe新建一个文本文件,内容就是一个严字,依次采用ANSIUnicodeUnicodebigendian和UTF-8编码方式保存然后,用文本编辑软件UltraEdit中的十六进制功能”,观察该文件的内部编码方式ANSI文件的编码就是两个字节DICF这正是严的GB2312编码,这也暗示GB2312是采用大头方式存储的Unicode编码是四个字节FFFE254E其中FFFE表明是小头方式存储,真正的编码是4E25Unicodebigendian编码是四个字节FEFF4E25其中FEFF表明是大头方式存储UTF-8编码是六个字节EFBBBFE4B8A5前三个字节EFBBBF表示这是UTF-8编码,后三个E4B8A5就是严的具体编码,它的存储顺序与编码顺序是一致的
1、ASCII(AmericanStandardCodeforInformationInterchange美国信息互换标准代码ASCH)是基于拉丁字母的一套电脑编码系统,它主要用于显示现代英语和其他西欧语言.它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC
646.
2、ASCH码是一个7位的编码,且该编码是唯一的一个字符.在这个页面,你可以找到8位的256个字符ASCH码表和Windows-1252(codepage1252它是国际标准ISO8859T的一个扩展字符集)标准保持一致;
3、ASCH码是AmericanStandardCodeforInformationInterchange的缩写,而不是ASCH(罗马数字2)有很多人在这个地方产生误解;
4、ASCII码规范于1967年第一次发布,最后一次更新是在1986年,它包含了33个控制字符具有某些特殊功能但是无法显示的字符和95个可显示字符;
5、通过下面的ASCH码对照表,可以查询出十进制DEC、八进制OCT、十六进制HEX、二进制BIN和符号之间的关系;
6、Ctrl+D收藏本网页Ctrl+S保存本网页到电脑;ASCH控制字符字符编码of在ASCH码表中,前32个字符是不能用于打印控制的编码,而是用于控制像打印机一样的外围设备十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description160201000010000DLE#016;数据链路转义170211100010001DC1#017;设备控制1180221200010010DC2#018;设备控制2190231300010011DC3#019;设备控制3200241400010100DC4#020;设备控制4210251500010101NAK#021;拒绝接收220261600010110SYN#022;同步空闲230271700010111ETB#023;传输块结束240301800011000CAN#024;取消250311900011001EM#025;介质中断260321A00011010SUB#026;替换27033IB00011011ESC#027;换码符十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description280341C00011100FS#028;文件分隔符29035ID00011101GS#029;组分隔符30036IE00011110RS#030;记录分离符31037IF00011111US#031;单元分隔符十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description320402000100000#032;空格3304121001000011•#033;感叹号34042220010001011#034;双引号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description350432300100011##035;井号360442400100100$#036;美元符370452500100101%#037;百分号380462600100110#038;与390472700100111f#039;单引号400502800101000#040;左括号410512900101001#041;右括号420522A00101010*#042;星号430532B00101011+#043;加号440542C00101100#044;逗号450552D00101101—#045;连字号或减号460562E00101110•#046;句点或小数点十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description470572F00101111/#047;斜杠4806030001100000#048;04906131001100011#049;15006232001100102#050;25106333001100113#051;35206434001101004#052;45306535001101015#053;55406636001101106#054;65506737001101117#055;75607038001110008#056;85707139001110019#057;9580723A00111010•*#058;冒号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description590733B00111011•#059;分号600743C00111100#060;小于610753D00111101#061;等号620763E00111110#062;大于630773F
001111119.#063;问号641004001000000@#064;电子邮件符号651014101000001A#065;大写字母A661024201000010B#066;大写字母B671034301000011C#067;大写字母C681044401000100D#068;大写字母D691054501000101E#069;大写字母E701064601000110F#070;大写字母F十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description711074701000111G#071;大写字母G721104801001000H#072;大写字母H731114901001001I#073;大写字母I741124A01001010J#074;大写字母J751134B01001011K#075;大写字母K761144C01001100L#076;大写字母L771154D01001101M#077;大写字母M781164E01001110N#078;大写字母N791174F010011110#079;大写字母0801205001010000P#080;大写字母P811215101010001Q#081;大写字母Q821225201010010R#082;大写字母R十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description831235301010011S#083;大写字母s841245401010100T#084;大写字母T851255501010101U#085;大写字母U861265601010110V#086;大写字母V871275701010111w#087大写字母W881305801011000X#088;大写字母X891315901011001Y#089;大写字母Y901325A01011010Z#090;大写字母Z911335B01011011[#091;左中括号921345C01011100\#092;反斜杠931355D01011101]#093;右中括号941365E01011110zv#094;音调符号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description951375F01011111—#095;下划线961406001100000#096;重音符971416101100001a#097;小写字母a981426201100010b#098;小写字母b991436301100011c#099;小写字母c1001446401100100d#100;小写字母d1011456501100101e小写字母e1021466601100110f#102;小写字母f1031476701100111g#103;小写字母g1041506801101000h#104;小写字母h1051516901101001*1#105;小写字母i1061526A01101010•J#106;小写字母j十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码文解释Description1071536B01101011k#107;小写字母k1081546C011011001#108;小写字母11091556D01101101m#109;小写字母m1101566E01101110n小写字母n1111576F011011110小写字母1121607001110000P#112;小写字母p1131617101110001q#113;小写字母q1141627201110010r小写字母r1151637301110011s小写字母s1161647401110100t#116;小写字母t1171657501110101u#117;小写字母u1181667601110110V#118;小写字母v十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description1191677701110111W#119;小写字母w1201707801111000X#120;小写字母X1211717901111001y#121;小写字母y1221727A01111010z#122;小写字母Z1231737B01111011{#123;左大括号1241747C011111001#124;垂直线1251757D01111101#125;右大括号1261767E01111110〜#126;波浪号1271777F01111111#127;删除十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description1282008010000000€#128;国盟符号12920181100000011302028210000010#130;单低9引号1312038310000011f带钩的拉丁小写字母f1322048410000100#132;双低9引号1332058510000101•••#133;水平省略号11342068610000110t#134;剑号1352078710000111t#135;1362108810001000八#136;修正字符抑扬音符号1372118910001001%o#137;千分号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description1382128A10001010S#138;带弯音号的拉丁大写字母S1392138B10001011#139;左单书名号1402148C10001100E#140;拉丁大写组合0E1412158D100011011422168E10001110z#142;带弯音号的拉丁大写字母z1432178F1000111114422090100100001452219110010001#145;左单引号1462229210010010#146;右单引号1472239310010011a#147;左双引号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description1482249410010100,,#148;右双引号1492259510010101•#149;1502269610010110一#150;半长破折号1512279710010111—#151;全长破折号11522309810011000〜#152;小波浪线1532319910011001TM#153;1542329A10011010#154;带弯音号的拉丁小写字母S1552339B10011011#155;右单书名号1562349C10011100oe#156;拉丁小写组合oe1572359D100111011582369E10011110z#158;带弯音号的十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description拉丁小写字母z1592379F10011111••Y#159;带弯音号的拉丁大写字母Y160240AO10100000#160;161241Al10100001*1#161;反向感叹号162242A2101000100#162;分币符号163243A310100011£#163;英磅符号164244A410100100#164;165245A510100101¥#165;人民币符号166246A610100110।।#166;167247A710100111§#167;章节符号168250A810101000••#168;通用货币符号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description169251A910101001©#169;版权符号170252AA10101010a#170;阴性顺序指示符号171253AB10101011«左角引号172254AC10101100-1#172;173255AD10101101#173;174256AE10101110@#174;175257AF10101111—#175;176260BO10110000o温度符号177261Bl10110001±#177;加/减号178262B2101100102#178;上标2179263B3101100113#179;上标3十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description180264B410110100#180;181265B510110101#181;微符号182266B610110110#182;段落符号,pi1crow183267B710110111■#183;中点184270B810111000J#184;185271B9101110011#185;上标1186272BA101110100#186;阳性顺序指示符187273BB10111011»#187;右角引号188274BC10111100%#188;分数四分之一189275BD10111101%#189;分数二分之一十进制DEC八进制OCT十六进制HEX二进制BIN190276BE10111110191277BF10111111192300CO11000000193301Cl11000001194302C211000010195303C311000011196304C411000100符号SymbolHTML实体编码中文解释Description%#190;•6#191;反向问号A#192;带重音符的大写字母AA#193;带尖锐重音的大写字母A人A#194;带音调符号的大写字母A〜A#195;带代字号的大写字母A••A#196;带元音变音(分音符号)的大写字母A十进制DEC八进制OCT十六进制HEX二进制BIN197305C511000101198306C611000110199307C711000111200310C811001000201311C911001001202312CA11001010203313CB11001011符号SymbolHTML实体编码中文解释DescriptionA#197;带铃声的大写字母AR#198;大写字母AE双重元音q#199;带变音符号的大写字母CE#200;带重音符的大写字母ErEU201;带尖锐重音的大写字母E/XE#202;带音调符号的大写字母E••E#203;带元音变音十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML1实体编码文解释Description(分音符号)的大写字母E204314CC11001100i#204;带重音符的大写字母I205315CD11001101#205;带尖锐重音的大写字母I206316CE11001110/\I#206;带音调符号的大写字母I207317CF11001111••I#207;带元音变音(分音符号)的大写字母I208320DO11010000D#208;209321DI11010001〜N#209;带代字号十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML1实体编码文解释Description的大写字母N210322D2110100100#210;带重音符的大写字母0211323D3110100110#211;带尖锐重音的大写字母0212324D411010100人0#212;带音调符号的大写字母0213325D511010101〜0#213;带代字号的大写字母0214326D611010110••0#214;带元音变音(分音符号)的大写字母0215327D711010111X#215;大写字母十进制DEC八进制OCT十六进制HEX二进制BIN216330D811011000217331D911011001218332DA11011010219333DB11011011220334DC11011100221335DD11011101符号SymbolHTML实体编码中文解释DescriptionOE连字0#216;带斜杠的大写字母0u#217;带重音符的大写字母Uu#218;带尖锐重音的大写字母u人u#219;带音调符号的大写字母U••u#220;带元音变音(分音符号)的大写字母UY#221;带元音变音十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML1实体编码文解释Description(分音符号)的大写字母Y222336DE11011110D#222;223337DF11011111B#223;德语高调小写字母s224340E011100000a#224;带重音符的小写字母a225341El11100001/a#225;带尖锐重音的小写字母a226342E211100010人a#226;带音调符号的小写字母a227343E311100011a#227;带代字号的小写字母a十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML1实体编码文解释Description228344E411100100♦・a#228;带元音变音(分音符号)的小写字母a229345E511100101oa#229;带铃声的小写字母a230346E611100110纪#230;小写字母ae双重元音231347E711100111q#231;带变音符号的小写字母C232350E811101000e#232;带重音符的小写字母e233351E911101001e#233;带尖锐重音的小写字母e十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML1实体编码文解释Description234352EA11101010人e#234;带音调符号的小写字母e235353EB11101011••e#235;带元音变音(分音符号)的小写字母e236354EC11101100X1#236;带重音符的小写字母i237355ED11101101/1#237;带尖锐重音的小写字母i238356EE11101110A1#238;带音调符号的小写字母i239357EF111011111#239;带元音变音(分音符号)十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML1实体编码文解释Description的小写字母i240360F011110000S#240;241361Fl11110001〜n#241;带代字号的小写字母n242362F2111100100#242;带重音符的小写字母0243363F3111100116#243;带尖锐重音的小写字母0244364F411110100人0#244;带音调符号的小写字母0245365F511110101〜0#245;带代字号的小写字母0十进制DEC八进制OCT十六进制HEX二进制BIN246366F611110110247367F711110111248370F811111000249371F911111001250372FA11111010251373FB11111011符号SymbolHTML实体编码中文解释Description••0#246;带元音变音(分音符号)的小写字母0■#247;小写字母oe连字0#248;带斜杠的小写字母0u#249;带重音符的小写字母U✓u#250;带尖锐重音的小写字母U人u#251;带音调符号的小写字母U十进制DEC八进制OCT十六进制HEX二进制BIN252374FC11111100253375FD11111101254376FE11111110255377FF11111111符号SymbolHTML实体编码中文解释Description#252;带元音变音(分音符号)的小写字母Uy#253;带元音变音(分音符号)的小写字母y2b#254;・♦y#255;十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description00000000000000NUL#000;空字符10010100000001SOH#001;标题开始20020200000010STX#002;正文开始30030300000011ETX#003;正文结束十进制DEC八进制OCT十六进制HEX二进制BIN符号SymbolHTML实体编码中文解释Description40040400000100EOT#004;传输结束50050500000101ENQ#005;询问60060600000110ACK#006;收到通知70070700000111BEL#007;铃80100800001000BS#008;退格9Oil0900001001HT#009;水平制表符10012OA00001010LF#010;换行键11013OB00001011VT垂直制表符12014OC00001100FF#012;换页键13015OD00001101CR#013;回车键14016OE00001110SO#014;移出15017OF00001111SI#015;移入。