字符编码

一、什么是字符

字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。字符是电子计算机或无线电通信中字母、数字、符号的统称。是计算机中经常用到的二进制编码形式,也是计算机中最常用到的信息形式。

二、字符集

不同民族、地区或系统使用不同的符号代表着相同不同的意义。对一个系统里使用的符号集合,我们称之为符号集。我们看如下几个概念

  • 字符集
    就是一套符号集
  • 编码字符集
    被人为编码的符号集合。用一个编码值code point来表示一个字符(即该字符在子库表中的位置),这个值称为字符对应于编码字符集的序号
  • 字符编码
    是编码字符集和实际存储数值之间的转换关系。字符,是根据字符编码方案转换为一个二进制数值存储在计算机中的。所以,字符编码是定义在字符集上的映射规则。(字符--->计算机中的实际存储值)

三、常用的编码字符集

3.1、ASCII

美国信息交换标准代码。早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符。

编码规则:使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

3.2、GB2312

中文字符集,包含ASCII字符集。用来表示中文的符号。

编码规则:ASCII部分用单字节表示,编码小于127的字符与ASCII编码相同,剩余部分用双字节表示,两个大于127的字符连在一起时,就表示一个汉字。基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。
3.3、GBK

即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。

编码规则:把 GB2312 没有用到的码位找出来用上。后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 “GBK” 标准。所有已经包含在GB2312中的汉字编码不变,另外增加更多的码位,大致为:第一个字节的值在0×81到0xFE之间,第二个字节的值在0×40到0xFE之间。

3.4、Unicode

统一码、万国码、单一码。是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
编码规则:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。 目前的Unicode字符分为17组编排,0x0000至0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。
Unicode 可以使用的编码有三种,分别是:

  • UFT-8:一种变长的编码方案,使用 1~6 个字节来存储
    如果只有一个字节,那么最高的比特位为 0;如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。具体的表现形式为:0xxxxxxx:单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的;
    110xxxxx 10xxxxxx:双字节编码形式;
    1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式;
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式
    例:中 Unicode码点为0x4E2D (0100 1110  0010 1101)
    转换后:1110 0100  1011 1000  10101101 --->0xE4B8AD
    文本文件以EF BB BF开始
  • UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储
    UTF-32 是固定长度的编码,始终占用 4 个字节,足以容纳所有的 Unicode 字符,所以直接存储 Unicode 编号即可,不需要任何编码转换。浪费了空间,提高了效率。文本以FF FE 00 00/00 00 FF FE开始
  • UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变
    UFT-16 比较奇葩,它使用 2 个或者 4 个字节来存储。对于 Unicode 编号范围在 0 ~ FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换,这跟 UTF-32 非常类似。对于 Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800~DBFF 之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于 DC00~DFFF 之间的双字节存储。文本以FE FF/FF FE开始。
原文地址:https://www.cnblogs.com/yilang/p/11179998.html