字符编码史话

您所在的位置:网站首页 傈僳语音翻译成日语 字符编码史话

字符编码史话

2023-03-12 09:15| 来源: 网络整理| 查看: 265

1. ASCII

在《计算机信息编码杂谈》文中提到ASCII的历史由来。

ASCII编码:全称American Standard Code for information Interchange,翻译过来就是美国信息交换标准码。

标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。

图片

其中:

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响  。 

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,

97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

百度百科

因此,这里包含了128个字符,也刚好占了7个Bit,共包括33个控制字符和95个可显示字符,这一字符集被称为ASCII。

2. EASCII

一开始,计算机是在美国使用的,128个字符也基本够用了。这个计算机是个好东西,后来传到了欧洲,欧洲可不全是用英语的啊,还有德、法、意等等呢。128个字符肯定是不够的,就像法语中有注音字符的。于是就将Byte中的最高位利用起来了,例如,法语的é的二进制流为1000 0010(即130),这样一来,这些欧洲国家的编码体系,可以表示最多256个字符了。这个就是扩展ASCII了,即EASCII(Extend ASCII)。

图片

但是,问题还是有的。不同的国家有不同的语言字母啊,256也是不够的。

最终导致的结果是,值为0~127的字符都是统一的,值为128~255对应的字符却因各个国家不一样而自行定义了。

混乱了吧,各国不一样的编码字符,总不能都叫EASCII吧。

于是,EASCII就这样成为了历史,目前很少用了。ISO/IEC 8859就这样诞生了。

ISO/IEC 8859与EASCII码类似,也同样是在ASCII码的基础上,利用了ASCII的7位编码所没有用到的最高位(首位),将编码范围从原先ASCII码的0x00~0x7F(十进制为0~127),扩展到了0x80~0xFF(十进制为128~255)。

ISO/IEC 8859其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符或者未定义,0xA0-0xFF之间是文字符号。

显然,ISO/IEC 8859字符编码方案同样是单字节编码方案,也同样完全兼容ASCII。

那么,0xA0-0xFF之间是到底是什么字符?欧洲国家那么多,语言也不一样,这里就需要标准,IEC就定义了16套规范定义。

此字符集支持部分于欧洲使用的语言,包括阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语。

百度百科

 

ISO/IEC 8859-1 (Latin-1)西欧语言ISO/IEC 8859-2 (Latin-2)中欧语言ISO/IEC 8859-3 (Latin-3)南欧语言。世界语也可用此字符集显示。ISO/IEC 8859-4 (Latin-4)北欧语言ISO/IEC 8859-5 (Cyrillic)斯拉夫语言ISO/IEC 8859-6 (Arabic)阿拉伯语ISO/IEC 8859-7 (Greek)希腊语ISO/IEC 8859-8 (Hebrew)希伯来语(视觉顺序)ISO 8859-8-I希伯来语(逻辑顺序)ISO/IEC 8859-9 (Latin-5 或 Turkish)它把Latin-1的冰岛语字母换走,加入土耳其语字母。ISO/IEC 8859-10 (Latin-6 或 Nordic)北日耳曼语支,用来代替Latin-4。ISO/IEC 8859-11 (Thai)泰语,从泰国的 TIS620 标准字集演化而来。ISO/IEC 8859-13 (Latin-7 或 Baltic Rim)波罗的语族ISO/IEC 8859-14 (Latin-8 或 Celtic)凯尔特语族ISO/IEC 8859-15 (Latin-9)西欧语言,加入Latin-1欠缺的芬兰语字母和大写法语重音字母,以及欧元(?符号。ISO/IEC 8859-16 (Latin-10)东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。

此时,有小伙伴会问,ISO/IEC 8859没有中文?为毛我的项目中是用ISO/IEC 8859能显示中文?

别急,先让我呵呵一会!

之所以你的项目用了ISO/IEC 8859能显示中文(表示中文字符),(我也遇到过)那时因为你们的工程师认为整出来的,毫不客气说是偷换概念。其实也有个好处,0~127部分仍然兼容ASCII字符,而A0~FF部分换成中文,即编码>0xA0的要用两个字符拼起来表示一个中文字符(毕竟中文字符比较多),实际上拼起来的是GB2312编码(后续会讲)。你这样用也没毛病,小项目反正是自己用自己知道,人家也没找你查版权问题。

3. GB2312

好了,回到正题。上文也提到GB2312了,这又是怎么来的呢?

话说,计算机传入中国后,我们也想着如何将有几千年历史的汉字搬进计算机。

《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。

GB2312编码适用于汉字处理和汉字信息交互等,一般在大陆使用,新加坡也用这套编码。

GB2312编码基本集收入汉字6763个汉字和682个非汉字图形字符。而整个字符集分94个区,每个区又分94个位,每个区位只有一个字符,于是,这种用区和位来对汉字编码,称为区位码。

01-09区特殊符号16-55区一级汉字,按拼音排序56-87区二级汉字,按部首/笔画排序10-15区未有编码88-94区未有编码

例如,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。

同理,可以从表中找到“白”字的区位码是1655。

注意,以上讲的是区位码,下面将字符的编码。

在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。 

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。 

“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。

那么,这个“啊”字的编码是什么?两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。理解了吧!或者干脆别算了,查表呗。

图片

(完整的表格建议自行在网上查阅)

4. GBK

浩瀚的中华文化肯定不止这六七千字啊,况且还有繁体字呢。于是,一个叫GBK的字符编码标准就横空出世了。

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订。

GBK是向下于GB2312兼容的。

GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。

GBK编码中的汉字和字符是非常全面的了。

GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充。具体包括:

GB 2312 中的全部汉字、非汉字符号。

GB 13000.1 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字。

《简化字总表》中未收入 GB 13000.1 的 52 个汉字。

《康熙字典》及《辞海》中未收入 GB 13000.1 的 28 个部首及重要构件。

13 个汉字结构符。

BIG-5 中未被 GB 2312 收入、但存在于 GB 13000.1 中的 139 个图形符号。

GB 12345 增补的 6 个拼音符号。

汉字“○”。

GB 12345 增补的 19 个竖排标点符号(GB 12345 较 GB 2312 增补竖排标点符号 29 个,其中 10 个未被 GB 13000.1 收入,故 GBK 亦不收)。

从 GB 13000.1 的 CJK 兼容区挑选出的 21 个汉字。

GB 13000.1 收入的 31 个 IBM OS/2 专用符号。

未录入《新华字典》上的一些字,如“韡”的简体。

 

GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

5. GB18030

那么,GB18030又是什么编码标准?

国家标准GB18030-2000《信息交换用汉字编码字符集基本集的补充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。

其实,你可以简单理解为是GBK的升级版。

GB 18030主要有以下特点 :

采用变长多字节编码,每个字可以由1个、2个或4个字节组成。

编码空间庞大,最多可定义161万个字符。

完全支持Unicode,无需动用造字区即可支持中国国内少数民族文字、中日韩和繁体汉字以及emoji等字符。

具体的编码规则都是大同小异,本文就不详细描述了,有兴趣可以自行查阅相关文献。

6. BIG5

等等,港澳台地区用什么编码?大家都知道,港澳台是用繁体字的,不大可能用GB2312吧,那么GBK?当时的湾湾不想跟大陆玩,他要自己搞,就搞出个BIG5来。

BIG5也叫“大五码”,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。

Big5虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家/地区标准或官方标准,而只是业界标准。倚天中文系统、Windows繁体中文版等主要系统的字符集都是以Big5为基准,但厂商又各自增加不同的造字与造字区,派生成多种不同版本。

2003年,Big5收录到CNS11643中文标准交换码的附录当中,获取了较正式的地位。这个最新版本称为Big5-2003。

包含字符:

共收录13,060个汉字及441个符号

编码方式:

用两个字节来为每个字符编码,第一个字节称为“高位字节”,第二个字节称为“低位字节”

注意,其和GBK等系列是不兼容的。

 

7. UNICODE

上文提到UNICODE,这个UNICODE又是什么?

各国为了在计算机字符编码里面争夺自己国家的语言字符高地,谁也不让着谁,在发展自己的字符编码时也没打算兼容其他的字符编码。看起来,有些混乱了,我想看下你的新闻,还得安装下你的文字系统,这全球化发展还怎么进行呢? 于是,一个叫ISO的组织还是出手了,他们是直截了当地干,不管你地方性的字符编码,我要重新定义一套,包含全球的所有文化文字、符合等,还给这种方案起了个名字叫Universal Multiple-Octet Coded Character Set,简称UCS,俗称UNICODE。 所以,这个UNICODE是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 话说的这么好听,UNICODE是怎么搞的呢?ISO着手搞这个UNICODE的时候是1990年的事了,内存发展已经有些长进了,用起来也没以前抠门了。于是这个UNICODE就被定义成两个字节表示一个字符,通通的两个字节啊,连ASCII都不放过,也是用两个字节。但是,对于ASCII这些原来用一个字节表示的字符,UNICODE保持其原来编码不变,只是将其扩展成两个字节而已,即在高字节补0。 这个UCS就是ISO定义的ISO 10646标准了,注意啊,UCS还不满足两个字节的,还有四个字节的,两个字节表示的叫UCS-2,四个字节的叫UCS-4。 那么这个UNICODE是怎么定义和分类字符的呢?看下面这个列表:

编码表示字符范围0000-007FC0控制符及基本拉丁文 (C0 Control and Basic Latin)0080-00FFC1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)0100-017F拉丁文扩展-A (Latin Extended-A)0180-024F拉丁文扩展-B (Latin Extended-B)0250-02AF国际音标扩展 (IPA Extensions)02B0-02FF空白修饰字母 (Spacing Modifiers)0300-036F结合用读音符号 (Combining Diacritics Marks)0370-03FF希腊文及科普特文 (Greek and Coptic)0400-04FF西里尔字母(Cyrillic)0500-052F西里尔字母补充 (Cyrillic Supplement)0530-058F亚美尼亚语 (Armenian)0590-05FF希伯来文 (Hebrew)0600-06FF阿拉伯文 (Arabic)0700-074F叙利亚文 (Syriac)0750-077F阿拉伯文补充 (Arabic Supplement)0780-07BF它拿字母 (Thaana)07C0-07FF西非书面语言 (N'Ko)0800-085F阿维斯塔语及巴列维语(Avestan and Pahlavi)0860-087F曼达文字 (Mandaic)0880-08AF撒马利亚语 (Samaritan)0900-097F天城文 (Devanagari)0980-09FF孟加拉语 (Bengali)0A00-0A7F锡克教文 (Gurmukhi)0A80-0AFF古吉拉特文 (Gujarati)0B00-0B7F奥里亚文 (Oriya)0B80-0BFF泰米尔文 (Tamil)0C00-0C7F泰卢固文 (Telugu)0C80-0CFF卡纳达文 (Kannada)0D00-0D7F德拉维族语 (Malayalam)0D80-0DFF僧伽罗语 (Sinhala)0E00-0E7F泰文 (Thai)0E80-0EFF老挝文 (Lao)0F00-0FFF藏文 (Tibetan)1000-109F缅甸语 (Myanmar)10A0-10FF格鲁吉亚语(Georgian)1100-11FF朝鲜文 (Hangul Jamo)1200-137F埃塞俄比亚语 (Ethiopic)1380-139F埃塞俄比亚语补充 (Ethiopic Supplement)13A0-13FF切罗基语 (Cherokee)1400-167F统一加拿大土著语音节 (Unified Canadian Aboriginal Syllabics)1680-169F欧甘字母 (Ogham)16A0-16FF如尼文 (Runic)1700-171F塔加拉语 (Tagalog)1720-173F哈努诺文 (Hanunóo)1740-175F布希德文 (Buhid)1760-177F塔格班瓦文 (Tagbanwa)1780-17FF高棉语 (Khmer)1800-18AF蒙古文 (Mongolian)18B0-18FF加拿大原住民音节文字扩展 (Unified Canadian Aboriginal Syllabics Extended)1900-194F林布文 (Limbu)1950-197F德宏泰语 (Tai Le)1980-19DF新傣仂语 (New Tai Lue)19E0-19FF高棉语记号 (Kmer Symbols)1A00-1A1F布吉文 (Buginese)1A20-1AAF老傣文 (Tai Tham)1AB0-1AFF组合变音标记扩展 (Combining Diacritical Marks Extended)1B00-1B7F巴厘语 (Balinese)1B80-1BB0巽他语 (Sundanese)1BC0-1BFF巴塔克文 (Batak)1C00-1C4F雷布查语(Lepcha)1C50-1C7F桑塔利文(Ol Chiki)1C80-1CDF曼尼普尔语(Meithei/Manipuri)1D00-1D7F音标扩展 (Phonetic Extensions)1D80-1DBF音标扩展补充 (Phonetic Extensions Supplement)1DC0-1DFF结合附加符号补充 (Combining Diacritics Marks Supplement)1E00-1EFF拉丁文扩充附加 (Latin Extended Additional)1F00-1FFF希腊语扩充 (Greek Extended)2000-206F常用标点(General Punctuation)2070-209F上标及下标 (Superscripts and Subscripts)20A0-20CF货币符号 (Currency Symbols)20D0-20FF组合用记号 (Combining Diacritics Marks for Symbols)2100-214F字母式符号 (Letterlike Symbols)2150-218F数字形式 (Number Form)2190-21FF箭头 (Arrows)2200-22FF数学运算符 (Mathematical Operator)2300-23FF杂项工业符号 (Miscellaneous Technical)2400-243F控制图片 (Control Pictures)2440-245F光学识别符 (Optical Character Recognition)2460-24FF封闭式字母数字 (Enclosed Alphanumerics)2500-257F制表符 (Box Drawing)2580-259F方块元素 (Block Element)25A0-25FF几何图形 (Geometric Shapes)2600-26FF杂项符号 (Miscellaneous Symbols)2700-27BF印刷符号 (Dingbats)27C0-27EF杂项数学符号-A (Miscellaneous Mathematical Symbols-A)27F0-27FF追加箭头-A (Supplemental Arrows-A)2800-28FF盲文点字模型 (Braille Patterns)2900-297F追加箭头-B (Supplemental Arrows-B)2980-29FF杂项数学符号-B (Miscellaneous Mathematical Symbols-B)2A00-2AFF追加数学运算符 (Supplemental Mathematical Operator)2B00-2BFF杂项符号和箭头 (Miscellaneous Symbols and Arrows)2C00-2C5F格拉哥里字母(Glagolitic)2C60-2C7F拉丁文扩展-C (Latin Extended-C)2C80-2CFF科普特语 (Coptic)2D00-2D2F格鲁吉亚语补充 (Georgian Supplement)2D30-2D7F提非纳文 (Tifinagh)2D80-2DDF埃塞俄比亚语扩展 (Ethiopic Extended)2E00-2E7F追加标点 (Supplemental Punctuation)2E80-2EFFCJK 部首补充 (CJK Radicals Supplement)2F00-2FDF康熙字典部首 (Kangxi Radicals)2FF0-2FFF表意文字描述符 (Ideographic Description Characters)3000-303FCJK 符号和标点 (CJK Symbols and Punctuation)3040-309F日文平假名 (Hiragana)30A0-30FF日文片假名 (Katakana)3100-312F注音字母 (Bopomofo)3130-318F朝鲜文兼容字母 (Hangul Compatibility Jamo)3190-319F象形字注释标志 (Kanbun)31A0-31BF注音字母扩展 (Bopomofo Extended)31C0-31EFCJK 笔画 (CJK Strokes)31F0-31FF日文片假名语音扩展 (Katakana Phonetic Extensions)3200-32FF封闭式 CJK 文字和月份 (Enclosed CJK Letters and Months)3300-33FFCJK 兼容 (CJK Compatibility)3400-4DBFCJK 统一表意符号扩展 A (CJK Unified Ideographs Extension A)4DC0-4DFF易经六十四卦符号 (Yijing Hexagrams Symbols)4E00-9FBFCJK 统一表意符号 (CJK Unified Ideographs)A000-A48F彝文音节 (Yi Syllables)A490-A4CF彝文字根 (Yi Radicals)A4D0-A4FF老傈僳文 (Lisu)A500-A63F瓦伊语 (Vai)A660-A6FF统一加拿大土著语音节补充 (Unified Canadian Aboriginal Syllabics Supplement)A700-A71F声调修饰字母 (Modifier Tone Letters)A720-A7FF拉丁文扩展-D (Latin Extended-D)A800-A82F锡尔赫特文 (Syloti Nagri)A840-A87F八思巴字 (Phags-pa)A880-A8DF索拉什特拉文 (Saurashtra)A8E0-A8FF天城文扩展 (Devanagari Extended)A900-A92F克耶里字母 (Kayah Li)A930-A95F勒姜字母 (Rejang)A960-A97F谚文扩展-A (Hangul Jamo Extended-A)A980-A9DF爪哇语 (Javanese)A9E0-A9FF缅甸文扩展-B (Myanmar Extended-B)AA00-AA5F占语字母 (Cham)AA60-AA7F缅甸文扩展-A (Myanmar Extended-A)AA80-AADF越南傣文 (Tai Viet)AAE0-AAFF曼尼普尔文扩展 (Meetei Mayek Extensions)AB00-AB2F埃塞俄比亚语字母扩展-A (Ethiopic Extended-A)AB30-AB6F拉丁文扩展-E (Latin Extended-E)AB70-ABBF切罗基语补充 (Cherokee Supplement)ABC0-ABFF曼尼普尔文 (Meetei Mayek)AC00-D7AF朝鲜文音节 (Hangul Syllables)D800-DB7F高位替代字符 (High Surrogates)DB80-DBFF高位专用替代字符 (High Private Use Surrogates)DC00-DFFF低位替代字符 (Low Surrogates)E000-F8FF私用区 (Private Use Zone)F900-FAFFCJK 兼容象形文字 (CJK Compatibility Ideographs)FB00-FB4F字母表达形式 (Alphabetic Presentation Form)FB50-FDFF阿拉伯表达形式A (Arabic Presentation Form-A)FE00-FE0F变量选择符 (Variation Selector)FE10-FE1F竖排形式 (Vertical Forms)FE20-FE2F组合用半符号 (Combining Half Marks)FE30-FE4FCJK 兼容形式 (CJK Compatibility Forms)FE50-FE6F小型变体形式 (Small Form Variants)FE70-FEFF阿拉伯表达形式B (Arabic Presentation Form-B)FF00-FFEF半型及全型形式 (Halfwidth and Fullwidth Form)FFF0-FFFF特殊 (Specials)

看起来好像很美好,问题还是存在的。计算机怎么知道几个字节表示一个字符呢?(注意字符和字节的概念啊),还有啊,ASCII就一个字节,你弄到UNICODE来表示却要两个字节,多浪费啊,至少欧美这种英文只用ASCII的国家不喜欢这套东西吧。

 

8. UTF

于是,一个叫UTF的东西出现了,没错,就是你知道的UTF-8,UTF-16和UTF-32的那个UTF。

UTF是UNICODE基于传输的一种格式,全称叫 Unicode Transformation Format,顾名思义,UTF-8就是每次传输8位数据,UTF-16是每次传输16位数据,那么UTF-32就是每次传输32位数据。 其中UTF-8用的最广泛了,Linux系统里面通通都用UTF-8了。现在来看看UTF-8是怎么定义这个Format的。

UTF-8编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。

UTF-8转换表表示如下

图片

 

9 后话

就这样讲完了?No!

Codepage是啥?

网页乱码是怎么回事?

什么是UTF-8的BOM?

UCS-2的Bid End和Little End?

UTF-8、UTF-16、UTF-32,GBK,Big5等等怎么转换?

iconv玩过吗?

什么CJK统一汉字?

汉字进入信息时代后发展前景怎样?

……

篇幅太长了,统统下回分解!

 

参考:

字符编码的前世今生

(https://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201307/218730.shtml)

关注公众号号“嵌入式软件实战派”,获得更多知识干货。

图片



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3