前言
你是不是工作了很多年了,一直没搞清楚计算机中的各种编码规则,虽然平时都会使用,但是内部机制原理一直都是之其然而不知其所以然,开发中也会经常涉及到这块内容,但都没有太多重视,这可能会让有吃一些亏(出项目bug了),本着追本溯源的精神或是为了让自己在少出血bug,小余今天就来聊聊这块内容。
目录
1.字符集与字符编码
首先要明确两概念, 字符集 (charset)和 字符编码 (encoding)。
字符集
字符集顾名思义: 很多字符的集合 。这些字符组成一套字符系统,用来表达我们生活中各种含义,
比如0~9以及各种加减法等符号的集合,可以表示生活中的“数字集合”,不然1+1是什么计算机可不知道? 26个大小写英文字母加上标点符号就组成了“英文字符集“,这些字符集在英美人看来就组成了一套符号系统,看到”I Love you“就知道什么意思了。 再比如我们新华字典中的所有汉字加上标点符号就组成了“中文字符集”,这个字符集就组成了中文文字系统。看到“我爱你”也就知道什么意思了,可以对于不懂中文的老外来,因为没有中文字符集,看到“我爱你”可就一脸懵逼了。
字符编码
字符编码 :言外之意就是 对字符进行编码 ,那为什么要对字符编码,其实字符编码最终目的就是为了存储或者传输。我们的计算机最早是用来提供算术功能的,和算盘功能类似,但是后来发现计算机可以做很多事情。 其中就包括存储机制,如何存储呢?假设“LOVE”这个单词,我们使用数字1代表L,数字2代表O,数字3代表V,数字4代表E,将1234存储在某个区域,这样就可以知道这4个数字代表了“LOVE”,当然实际LOVE有自己的字符表示,这里使用1234作为例讲解。
字符编码的四个步骤
要在计算机中建立一个“字符编码模型”,需要四个步骤:
- 1.要有一个 字符库 ,确定这些字符库足够表意。比如ASCII字符集,已经足够表示英文系统,但是不能表达中文,于是有了GB2312字符集。
-
- 第一层编码 :给每个字符选个数字(Code Point),比如ASCII码中,用65表示“A”,97表示“a”。
-
- 第二层编码 :确定表示字符的二进制位数(8位,16位,32位)。ASCII码使用7位来表示,因为当时制定者觉得7位以及够用了,DBCS(双字节字符集)使用了16位。
- 4.第三层编码: 确定字符的二进制存储方式(大端还是小端)。比如X86机器使用小端。
一个字符一般只有一种编码格式,当字符集中的字符不够用时,会增加一些新的字符,使用新的字符编码格式,形成新的字符集。所以 有时候字符集和字符编码的概念是很模糊的,并不严格区分 。比如ASCII码既可以成为一段“字符集”,也可以称为一种“编码格式”。
也有一些字符集有多种编码格式:如Unicode,其中UTF-8和UTF-16等都是其编码格式,这个后面是详细讲解。
2.常用计算机编码
1.ASCII码
ASCII码全称“American Standard Code for Information Interchange”, 美国标准信息交互码 ,由美国标准委员会(American Standards Association,简称ASA)制定,后来该协会改组为“美国国家标准学会”(American National Standard Institute , 简称ANSI ),所以很多资料上说ASCII码是由ANSI指定的。
ASCII码是从电报码发展过来的,最早使用在7-bits电传打印机上。1960年,ASA将ASCII标准化,于1963年发布第一版,1967年再发布一次大的版本,这个标准版本,也是一个7-bit码,包含33个非打印字符(现在许多已经废弃了),95个打印字符(包含空格符),编码范围为0~127。
然而ASCII码只是美国的标准,对于其他国家,如中文,日文,韩文等大多使用的是象形文字,127个字符远远无法表达中国的汉字文化,于是各国在ASCII的基础上制定了自己的字符集,但是 本质上都兼容ASCII ,如中国大陆的GK2312,台湾省的(Big5)小日子的JIS等编码规范。
2.EASCII
其实标准的ASCII就是7-bit的编码(8字节,但是最高位没有编码),后来使用过程中发现127个字符有点不够用,于是将ASCII进行了扩展,叫做EASCII或者high-ASCII,8位的,能表示256个字符。
由于不同的应用场景,有不同的编码,有IBM的Extend ASCII和ANSI的Extend ASCII。 去wikipedia上会发现有好多种ASCII的标准,大类就是IBM和ANSI(Windows的,微软很强势,ANSI的东西感觉就是给他们家用的)两种,其实都是为了给自家系统用的,随着IBM操作系统的坠落,IBM的扩展ASCII也根本上淡出视野。
扩展的ASCII的产生
搭载Windows系统的计算机进入欧洲之后,发现标准的ASCII并不能满足欧洲这些拉丁语族国家的语言表意,决定对其进行扩展。同为印欧语系,发现扩展起来也没那么难,总共256个值就包括所有了。只需要将原来的7-bit扩展为8-bit,将原来的标准ASCII保留,第一位使用0来表示。将扩展的字符第一位使用1来表示
扩展ASCII的组成
具体来讲,扩展后的ASCII码表可以看成 由三部分组成 :
- 第一部分 :由00H到1FH共32个,一般用来通讯或作为控制之用。有些可以显示在屏幕上,有些则不能显示,但能看到其效果(如换行、退格)
- 第二部分 :是由20H到7FH共96个,这95个字符是用来表示阿拉伯数字、英文字母大小写和下划线、括号等符号,都可以显示在屏幕上.
- 第三部分 :由80H到0FFH共128个字符,一般称为"扩充字符",这128个扩充字符是由IBM制定的,并非标准的ASCII码.这些字符是用来表示框线、音标和其它欧洲非英语系的字母。
3.ISO-8859
由于每个国家以及公司对编码的各自定制化,导致 同一个字符在不同电脑之间由于编码的不一致,显示的结果也不一样,现象就是乱码 。 那为了解决这个问题,ISO组织统一了一套标准的字符集。
与ASCII、EASCII字符编码方案只包括单个独立的字符集不同,ISO/IEC 8859字符编码方案包括了一组字符集, 或者说ISO/IEC 8859相当于是一组字符集的总称,其内共包含了15个字符集, 即ISO/IEC 8859-n,n=1、2、3…15、16,其中12未定义,所以实际上共15个。
这15个字符集,大致上包括了欧洲各国所使用到的字符(甚至还包括一些外来语字符),而且每一个字符集的补充扩展部分(即除了兼容ASCII字符之外的部分),都只实际使用了0xA00xFF(十进制为160255)这96个编码,而0x800x9F(十进制为128159)这32个编码并未实际定义字符。
其中,目前使用得最为普遍的是ISO/IEC 8859-1字符集,收录了西欧常用字符(包括德法两国的字母)。
ISO/IEC 8859-1往往简称为ISO 8859-1,而且还有一个称之为Latin-1(也写作Latin1)的别名,即:ISO/IEC 8859-1 = ISO 8859-1 = Latin-1 = Latin1。
从ISO 8859-1到ISO 8859-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) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。
-
计算机
+关注
关注
19文章
7488浏览量
87849 -
编码
+关注
关注
6文章
940浏览量
54814 -
BUG
+关注
关注
0文章
155浏览量
15665
发布评论请先 登录
相关推荐
评论