打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
字符编码学习笔记
+计算机只能识别二进制数据。这种二进制数据称为计算机的内码。
   -內碼指的是「將資訊編碼後,透過某種方式儲存在特定記憶裝置時,裝置內部的編碼形式」
   -二进制数据格式如:1010100100101000,只有1和0。
-人类使用的是字符(character),它是文字和符号的总称,如各种汉字,英文字母,数学符号,标点符号等。对计算以而言这些东西是无法理解的。
-为了让计算机能存取字符,人类约定了字符和内码的对应关系,这种对应关系称为字符编码(encoding)。
-各个国家和地区使用的字符不尽相同,如英国使用的是阿拉伯字母,中国使用的是汉字,日本使用日文。这些字符都是各个国家和地区的人类自己发明的。
+很多个字符的集合称为“字符集”(Character Set),各个国家把特定的一些字符组成特定的字符集。所以世界上存在很多的字符集。如果把字符集与计算机的机器码建立一一对应的关系,则我们称这个字符集称为编码过的字符集(Coded Character Set)。因为各种字符集一般都建立了与计算机的对应关系,所以一般我们说的字符集都是指编码过得字符集。
   -需要根据字符集的数量来确定一个字符需要用几位的机器码来对应。如果一个字符集有8个字符,则每个字符用3位机器码就可以表示。范围是000-111。
+常见的字符集
   +【ASCII】(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的字符集。它主要用于显示现代英语。
       +http://yangjun1120.spaces.live.com/blog/cns!F9D66F146BA5A776!425.entry?&_c02_owner=1
           -ASCII码是7位编码,共128个字符。编码范围:0x00-0x7F。其中0x00-0x20 和0x7F共33个控制字符。
           -只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。
       +http://zh.wikipedia.org/zh/ASCII
           -ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的字符集。它主要用于显示现代英语。
           -SCII第一次以規範標準的型態發表是在1967年,最後一次更新則是在1986年。
           +至今為止共定義了128個字元;其中33個字元無法顯示(這是以現今作業系統為依歸,但在DOS模式下可顯示出一些諸如笑臉、撲克牌花式等8-bit符號)。
               -這33個字元多數都已是陳廢的控制字元。控制字元的用途主要是用來操控已經處理過的文字。
           -在33個字元之外的是95個可顯示的字元,包含用鍵盤敲下空白鍵所產生的空白字元也算1個可顯示字元(顯示為空白)。
           +缺點
               -ASCII的最大缺點是只能顯示26個基本拉丁字母,因此只能用於顯示現代美國英語(而且在處理英語當中的外來詞如na?ve、café、élite等等時,所有重音符號都不得不去掉,即使這樣做會違反拼寫規則)。而EASCII雖然解決了部份西歐語言的顯示問題,但對更多其他語言依然無能為力。因此現在的蘋果電腦已經拋棄ASCII而轉用Unicode。
       -ASCIIC收录了空格及94个“可印刷字符”,足以给英语使用。但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的附加符号字母,故可以使用ASCII及控制字符以外的区域来储存及表示。除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、希伯来语等,都可以使用这个形式来储存及表示。
   -【EASCII】(Extended ASCII,延伸美国标准信息交换码)是将ASCII码由7位扩充为8位而成。其中最常用的就是ISO 8859
   +【ISO 8859】,全称ISO/IEC 8859,是一系列8位字符集的标准规范,现定义了15个字符集。
       +【ISO 8859-1】,正式编号为ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。
           -此字符集支援部分于欧洲使用的语言,包括阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语。
           -英语可用7位编码储存,而其他使用拉丁字母、希腊字母、西里尔字母、希伯来字母等的语文,由于只使用数十个字母,传统上均使用8位编码的ISO/IEC 8859标准来表示。但由于汉语、日语及朝鲜语字数众多,无法用单一个8位字符来表达,故需要多于一个字节来代表一个字。于是,ISO 2022就设计出来让汉语、日语及朝鲜语可以使用数个7位编码的字符来示。
   +【ISO 2022】【区位码】,全称ISO/IEC 2022,由国际标准化组织(ISO)及国际电工委员会(IEC)联合制定,是一个使用7位编码表示汉语文字、日语文字或朝鲜文字的方法。
       +ISO 2022使用“逃逸字串”(Escape sequence)。逃逸字串由1个“ESC”字符(0x1B),再由两至三个字串组成。此标记代表它后面的字符,属于下表字符集的文字。
           -【逃逸字符】也叫转义字符,代表了某个特定的意思,经常用在字符串的定义中,比如"\"就是C语言常用的逃逸字符。当我们在字符串中说明一个特别的字符时要用到,例如"\n"表示换行,"\r"表示回车,因为这些字符的ASCII码不能直接放入字符串中因此需要用逃逸字符来表示,当编译器碰到\n \r时会自动翻译成ASCII的0xa, 0xd.
   +【EUC】全名为Extended Unix Code,是一个使用8位编码来表示字符的方法。
       -它使用了一些兼容于ISO/IEC 2022区位码的94x94编码表,把每个区位加上0xA0来表示,以便兼容于ASCII。它主要用于表示及储存汉语文字、日语文字及朝鲜文字。
       +EUC-CN是GB 2312最常用的表示方法。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。
           -EUC-CN可以理解为 GB2312的别名,和GB2312完全相同。
   +【GB 2312】是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》
    http://zh.wikipedia.org/zh-cn/GB_2312
       -由中国国家标准总局发布,1981年5 月1日实施。
       -GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个
       -同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
       -GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
       -GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。
       +GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
           -01-09区为特殊符号。
           -16-55区为一级汉字,按拼音排序。
           -56-87区为二级汉字,按部首/笔画排序。
           -10-15区及88-94区则未有编码。
           -举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
       +区位码与内码的对应关系
           -一个汉字的内码占两个字节,分别称为高位字节与低位字节。
           -这两位字节与区位码的关系如下: 内码高位=区码+A0H(H表示十六进制) 内码低位=位码+A0H。
           +例如,汉字”啊”的区位码为”1601″用十六进制表示即为”1001H”,则它的内码为”B0A1H”。
               -其中B0H为内码的高位字节,A1H为内码的低位字节。
       -GB2312区域码全表:
        http://www.mytju.com/classCode/tools/QuWeiMa_FullList.asp
       -对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
   +【GBK】全名为汉字内码扩展规范,英文名Chinese Internal Code Specification。K  即是“扩展”所对应的汉语拼音(KuoZhan11)中“扩”字的声母。GBK 来自中国国家标准代码GB 13000.1-93。
       -GBK编码是 GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。
       -GBK还收录了 GB2312不包含的 汉字部首符号、竖排标点符号等字符。
       -GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。
       -高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。
       -范围         第1字节 第2字节     编码数    字数
        水准 GBK/1     A1–A9     A1–FE         846    717
        水准 GBK/2     B0–F7     A1–FE         6,768    6,763
        水准 GBK/3     81–A0     40–FE (7F除外) 6,080    6,080
        水准 GBK/4     AA–FE     40–A0 (7F除外) 8,160    8,160
        水准 GBK/5     A8–A9     40–A0 (7F除外) 192    166
        用户定义     AA–AF     A1–FE         564
        用户定义     F8–FE     A1–FE         658
        用户定义     A1–A7     40–A0 (7F除外)    672
        合计:                     23,940    21,886
       -上述GBK/1和GBK/2的领域即GB 2312-80用通常方法编码的区域。
       +低字节是 0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,与ASCII不兼容,这样会给一些系统带来麻烦。
           -CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。
   +【GB18030】全称:国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集.
       -与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。
       -与 UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
       -支持中国国内少数民族的文字,不需要动用造字区。
       -汉字收录范围包含繁体汉字以及日韩汉字
   +【Big5】,又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的计算机汉字字符集标准,共收录13,060个汉字。
       -Big5是双字节编码,高字节编码范围是0x81-0xFE,低字节编码范围是0x40-0x7E和0xA1-0xFE。
       -和GBK相比,少了低字节是0x80-0xA0的组合。0x8140-0xA0FE是保留区域,用于用户造字区。
       -Big5收录的汉字只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录。GBK收录的日文假名字符、俄文字符Big5也没有收录。
       -因为Big5当中收录的字符有限,因此有很多在Big5基础上扩展的编码,如倚天中文系统。
       -Windows系统上使用的代码页CP950也可以理解为是对Big5的扩展,在Big5的基础上增加了7个汉字和一些符号。
       -因为Big5也占用了 ASCII的编码空间(低字节所使用的0x40-0x7E),所以Big5编码在一些环境下存在和GBK编码相同的问题
   +【UCS】通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。
       -Unicode组织和ISO组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号,这个字符集就是通用字符集(UCS,Universal Character Set)。
       -这两个组织经过协调,虽然在各自发展,但定义的字符位置是完全一致的。
       -ISO 10646标准定义了一个31位的字符集。前两个字节的位置(0x0000-0xFFFD)被称为基本多语言面(Basic Multilingual Plane, BMP) ,超出两个字节的范围称作辅助语言面。
       -BMP基本包括了所有语言中绝大多数字符,所以只要支持BMP就可以支持绝大多数场合下的应用。Unicode 3.0对应的字符集在BMP范围内。
       -UCS字符集为每个字符分配了一个位置,通常用“U”再加上某个字符在UCS中位置的16进制数作为这个字符的UCS表示,例如“U+0041”表示字符“A”。
       -UCS字符 U+0000到U+00FF与ISO-8859-1完全一致。
   +【UCS-2】、【UTF-16】是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。
       +UCS-2是两个字节的等宽编码,因为只是使用了两个字节的编码空间,所以只能对BMP中的字符做编码。
           -UCS-2 不同于GBK和Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。
       +UTF-16是变长编码,用两个字节对BMP内的字符编码,用4个字节对超出BMP范围的辅助平面内的字符作编码。
           -UTF-16是UCS- 2的超集,UTF-16编码的两字节编码方式完全和UCS-2相同。
       +UCS-2和UTF- 16在存储和传输时会使用两种不同的字节序,分别是big endian和little endian(大尾和小尾)。UCS-2BE的别名。
           -例如“啊”(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默认的字节序是big endian方式。
           -在传输过程中为了说明字节序需要在字节流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。
           -UCS-2BE、UCS-2LE是实际应用中使用的编码名称,对应着big endian和little endian,UTF-16BE、UTF-16LE也是如此。
           -因为默认是 BE字节序,所以可以把UCS-2当做是UCS-2BE的别名。
   +【UTF-8】是UCS字符集的另一种编码方式
       -TF-16的每个单元是两个字节(16位),而UTF-8的每个单元是一个字节(8位)。
       -UTF-16中用一个或两个双字节表示一个字符,UTF-8中用一个或几个单字节表示一个字符。
       -可以认为UTF-8编码是根据一定规律从UCS-2转换得到的。
       +从UCS-2到UTF- 8之间有以下转换关系:
           +UCS-2             UTF-8
            U+0000 - U+007F     0xxxxxxx
            U+0080 - U+07FF     110xxxxx 10xxxxxx
            U+0800 - U+FFFF     1110xxxx 10xxxxxx 10xxxxxx
               -例如“啊”字的UCS- 2编码是0x554A,对应的二进制是0101 0101 0100 1010,转成UTF-8编码之后的二进制是 1110 0101 10 010101 10 001010,对应的十六进制是0xE5958A。
       +根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性:
           -UTF-8完全和 ASCII兼容。
           -大于U+007F的 UCS字符,在UTF-8编码中至少是两个字节。
           -UTF-8中的每个字符编码的首字节总在0x00-0xFD之间。
           -根据首字节就可以判断之后连续几个字节。     
           -GBK编码中的汉字字符都在UCS-2中的范围都在U+0800 - U+FFFF之间,所以每个GBK编码中的汉字字符的UTF-8编码都是3个字节。
           -但GBK中包含的其他字符的UTF-8编码就不一定是3个字节了,如GBK中的俄文字符。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
struts原理与实践(4)
中文字符编码标准Code Page
编码又见编码
字符集与字符集编码简介
Java中的字符集编码入门
深入分析Oracle字符集(转载)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服