Aya的学习笔记:字符编码格式

一,字符编码

windows notepad里txt文件的几种编码格式:
windows notepad里txt文件的几种编码格式

二,门电路和二进制

我们都知道计算机本质上由门电路组成,只有通断两种状态,即二进制的1,0。
硬件只能识别高低电位,但是使用硬件保存或输出人类能够识别的信息在我们看来是理所当然的事。有没有想过这是怎么做到的呢?

一个二进制信息称为(bit)。一位信息只有两种状态。用来显示字符恐怕不行。但依靠位的组合就可以显示多种信息。
现在计算机使用字节(byte)作为一个最小的信息单位,一个字节包含八个二进制信息,
可以显示2的8次方(256)种信息。如果用来显示数字可以显示 -128~127 或者 0~255。

三,计算机的信息交换

在这里插入图片描述
1880年代,美国人口调查局职员赫尔曼·何乐礼发明了用于人口普查数据的穿孔卡片及机器,并用于1890年美国人口普查,仅6周就完成了统计。而此前1880年美国人口普查的数据全靠手工处理,历时7年才得出最终结果。

1928年,IBM发明的80列、矩形孔卡片,成为事实上的标准。

这种卡片称为打孔卡。是人们为了与计算机进行信息交换的发明。虽然当时的计算机还是机械。

后来,人与数字计算机的信息交换,继承与打孔卡的方式。发展为6比特的字符编码:用4比特表示第0行至第9行的哪一行被穿孔;用2比特表示第11、第12行的哪一行被穿孔。这可以表示所有的单孔或者双孔的字符表示,这被称作“二进制编码的十进制交换码”(Binary Coded Decimal Information Code,BCDIC, BCD码)。所以,早期计算机的1个字节是6bit。

1964年,IBM在BCDIC上又增加2个比特,形成了8比特的“扩充的二进制编码的十进制交换码”(Extended Binary Coded Decimal Information Code,EBCDIC)。
因为EBCDIC脱胎于穿孔卡,所以其字母表是以9个为一组,彼此不连续编码表示的,这给程序员带来了很大不便。1967年,美国国家标准学会(American National Standard Institute , ANSI )制定ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)
至今通用。

四,ASCII码

ASCII
ASCII (美国信息交换标准代码,American Standard Code for Information Interchange)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。
ASCII码由8个二进制位表示,最高位为0。共定义了128个字符。基本只能满足英语国家使用所以还需要各国指定自己的编码标准。

只有拉丁字母当然不可能满足所有国家的使用需求。因为一个字节最多能定义256个字符,所以一些国家扩展了ASCII码(ISO-8859-1~ISO-8859-15),方便本国使用。
ISO-8859一系列标准仍然是单字节编码,对于亚洲国家(例如汉字)。256个字符全用上也不够塞牙缝的。所以他们想了一些办法:用两个字节来定义,这样可以表示65536个字符。如此便解决了众多文字和计算机信息交换的需求。

五、JIS基本汉字

1978年,日本工业规格协会( Japan Industrial Standard)制定了JIS C 6226,即 7ビット及び8ビットの2バイト情報交換用符号化漢字集合(JIS基本汉字)。这也是全世界最早的汉字编码字符集。
JIS基本汉字收录了6879个图形字符,包括6355个汉字和524个非汉字图形符号,采用了行号列号和区位结合的方式定位,共分为94区,而每区编入94个字符(但实际上为了分类方便,并不是每个区都是满编94个字符)。习惯上称第一个字节为高字节,第二个字节为低字节。高字节表示该字符所在的区,低字节由行列号确定该字符在区内的位。01区-09区为非汉字图形字符,16区-84区为汉字。

JIS基本汉字各区编码内容如下:

  • 01区-02区 特殊文字共147个字符
  • 03区 阿拉伯数字以及英文字母大小写共62个字符
  • 04区 平假名共83个字符
  • 05区 片假名共86个字符
  • 06区 希腊字母大小写共48字符
  • 07区 西里尔字母大小写共66个字符
  • 08区 制表符共32个字符
  • 16区-47区 一级汉字共2965个字符
  • 48区-84区 二级汉字共3390个字符
  • 85区-94区 私人造字区

注:一级汉字和二级汉字的划分依据是使用频率,将使用频率高的汉字划分为一级汉字。

为什么是94个区呢?
ASCII的前32个字符就是控制字符,实际上第128个字符也是控制码(DEL,删除),而区位又是从01开始计数,所以128-32-1-1=94。其实这个数字也是在尽可能的范围内取得最大值。

六, GB 2312—1980 信息交换用汉字编码字符集

中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。
GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。
GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。
这种表示方式也称为区位码。

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

举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。

1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。

七,ANSI

不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。
这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码。
在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。
为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

八,Unicode

Unicode是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
中国制定了GB2312编码,用来把中文编进去。类似的,日文和韩文等其他语言也有这个问题。
为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

Unicode 是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。

九,Unicode 转换格式(UTF)

Unicode 转换格式:Unicode Transformation Format(UTF)

  • UTF-1– UTF-8的前任, 兼容ISO 2022 不再是Unicode Standard的部分
  • UTF-7– 用在email中的7位编码,也已经被废弃了 不再是Unicode Standard的部分
  • UTF-8– 一种8位可变长编码,和ASCII兼容。
  • UTF-EBCDIC– 类似 UTF-8的8位可变长编码, 主要为了与EBCDIC兼容 不再是Unicode Standard的部分
  • UTF-16– 16位的可变长编码
  • UTF-32– 32位定长编码

UTF-8

UTF-8是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

UTF-8使用1~4字节为每个字符编码:

  • 一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
  • 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文
  • 阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
  • 其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
  • 其他极少使用的语言字符使用4字节编码。

UTF-8编码规则:

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

UTF-8转换表表示如下:

  • 1字节 0xxxxxxx
  • 2字节 110xxxxx 10xxxxxx
  • 3字节 1110xxxx 10xxxxxx 10xxxxxx
  • 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

因此UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的,位高低顺序也相同。
实际将UNICODE转换为UTF-8编码时应先去除高位0,然后根据所剩编码的位数决定所需最小的UTF-8编码位数。
因此那些基本ASCII字符集中的字符(UNICODE兼容ASCII)只需要一个字节的UTF-8编码(7个二进制位)便可以表示。

字节顺序标记(BOM)

因为Unicode有多种编码格式,编码方式不同的文本在硬件看来都是一堆二进制码。所以需要BOM标记来区分。

BOM(Byte Order Mark),字节顺序标记。出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。

编码表示:十六进制
UTF-8EF BB BF
UTF-16(大端序)FE FF
UTF-16(小端序)FF FE
UTF-32(大端序)00 00 FE FF
UTF-32(小端序)FF FE 00 00
UTF-72B 2F 76 [ 38 ,39 ,2B , 2F ]
en:UTF-1F7 64 4C
en:UTF-EBCDICDD 73 66 73
en:Standard Compression Scheme for Unicode0E FE FF
en:BOCU-1FB EE 28及可能跟随着FF
GB-1803084 31 95 33

关于Unicode

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。
然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。
历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。
前者开发的 ISO/IEC 10646 项目,后者开发的统一码项目。因此最初制定了不同的标准。
1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。两个项目仍都存在,并独立地公布各自的标准。但统一码联盟和ISO/IEC JTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。在发布的时候,Unicode一般都会采用有关字码最常见的字型,但ISO 10646一般都尽可能采用Century字型。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值