字符集(Character Set)和字符编码(Character Encoding)

计算机字符编码

字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符号,数字等。

字符集(Character Set、Charset):字符集是多个符号的集合,每个字符集包含的字符个数不同。

字符编码(Character Encoding):字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多少字节表示等问题,则是由编码来决定的。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

ASCII字符集

由于计算机只识”数”,因此必须告诉计算机哪个数字来代表哪个特定字符,美国国家标准协会 ANSI 制定了一个标准,规定了常用字符的集合以及每个字符对应的编号,这就是 ASCII 字符集,也称 ASCII 码。

  • 0~31 及 127:是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)
  • 32~126:是打印字符,其中 32 为空格,48~57 为 0 到 9 十个阿拉伯数字,65~90 为 26 个大写英文字母,97~122 号为 26 个小写英文字母,其余为一些标点符号、运算符号等。
  • 后 128 个称为扩展 ASCII 码。许多基于 x86 的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
OEM字符集的衍生
  1. 当计算机开始发展起来的时候,发现ASCII 字符集里的 128 个字符已经无法满足需求。一个字节能够表示的数字(编号)有 256 个,而 ASCII 字符只用到了 0x00~0x7F,也就是占用了前 128 个,后面 128 个数字没有被利用。
  2. 因此很多人开始利用后面 128 个数字,但是不同人对这些数字分别对应什么样的字符的想法不同,这导致出现了大量各式各样的 OEM 字符集(对于 0x00~0x7F 这个范围的解释基本是相同的,而对于后半部分 0x80~0xFF 的解释却不一定相同,甚至有时候同样的字符在不同 OEM 字符集中对应的字节也是不同的),不同的 OEM 字符集导致人们无法跨机器交流各种文档。
多字节字符集(MBCS)和中文字符集
  1. 上面的字符集都是基于单字节编码,也就是一个字节翻译成一个字符。
  2. 但是对于亚洲国家来说,256 个字符是远远不够用的,因此就发明了多字节编码方式,相应的字符集就称为多字节字符集(Muilti-Bytes Charecter Set,保持和 ASCII 字符集的兼容)。
  3. 中国使用的就是双字节字符集编码。例如目前最常用的中文字符集 GB2312,涵盖了所有简体字符以及一部分其他字符;GBK(Guo-Biao Kuozhan)则在 GB2312 的基础上加入了对繁体字符等其他非简体字符(这两个字符集的字符都是使用 1-2 个字节来表示)。
  4. Windows 系统采用 936 代码页来实现对 GBK 字符集的编解码。在解析字节流的时候,如果遇到字节的最高位是 0 的话,那么就使用 936 代码页中的第 1 张码表进行解码,这就和单字节字符集的编解码方式一致了;如果遇到字节的最高位是 1 的话,那么就表示需要两个字节值才能对应一个字符。

示例:我叫ABC

11001110 11010010 10111101 11010000 01000001 01000002 01000003

ps:全角是一种电脑字符,且每个全角字符占用两个标准字符(或半角字符)位置。通常的英文字母、数字键、符号键都是半角的,半角的显示内码都是一个字节。为了排列整齐,英文和其它拉丁文的字符和标点也提供了全角格式。

ANSI标准、ISO标准、国家标准
  1. 不同 ASCII 衍生字符集的出现,让文档交流变得非常困难,因此各种组织都陆续进行了标准化流程。
  2. 美国 ANSI 组织制定了 ANSI 标准字符编码(我们现在通常说到 ANSI 编码,指的是平台的默认编码,例如英文操作系统中是 ISO-8859-1,中文系统是 GBK)。
  3. ISO 组织制定的各种 ISO 标准字符编码,例如ISO 10646标准为“通用字符集”(UCS,Universal Character Set)定义了一种16位的编码方式(即 UCS-2 )。
  4. 还有各国也会制定一些国家标准字符集,例如中国的 GBK,GB2312 和 GB18030。

ps:操作系统在发布的时候,通常会往机器里预装这些标准的字符集还有平台专用的字符集,这样只要你的文档是使用标准字符集编写的,通用性就比较高了。

Unicode字符集
  1. 虽然通过使用不同字符集,我们可以在一台机器上查阅不同语言的文档,但是如果一份文档中含有不同国家的不同语言的字符,那么无法在一份文档中显示所有字符。
  2. 为了解决这个问题,我们需要一个全人类达成共识的巨大的字符集,这就是 Unicode 字符集。
  3. Unicode 字符集涵盖了目前人类使用的所有字符,并为每个字符进行统一编号,分配唯一的字符码(Code Point)。
  4. Unicode 字符集将所有字符按照使用上的频繁度划分为 17 个层面(Plane),每个层面上有 216=65536 个字符码空间。其中第 0 个层面 BMP,基本涵盖了当今世界用到的所有字符。其他的层面要么是用来表示一些远古时期的文字,要么是留作扩展。我们平常用到的 Unicode 字符,一般都是位于 BMP 层面上的。目前 Unicode 字符集中尚有大量字符空间未使用。

ps:随着 Unicode 与 ISO 10646 合并统一,Unicode 就用 UCS 通用字符集标准,早期的 Unicode 编码实现也就采用了 UCS-2。

UTF-x字符编码
  1. 为解决 Unicode 如何在网络上传输的问题,出现了面向传输的众多 UTF(UCS Transfer Format)标准(UTF-8 就是每次 8 个位传输数据,而 UTF-16 就是每次 16 个位)。
  2. UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
  3. UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号。从 Unicode 到 uft-8 并不是直接的对应,而是要过一些算法和规则来转换。
Unicode 符号范围(十六进制)UTF-8 编码方式(二进制)
0000 0000—0000 007F0xxxxxxx(兼容原来的 ASCII)
0000 0080—0000 07FF110xxxxx 10xxxxxx
0000 0800—0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000—0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

示例:殷(Unicode编码:27575,十六进制:6BB7,二进制:0110 1011 1011 0111)

1110xxxx 10xxxxxx 10xxxxxx	// UTF-8 编码方式
11100110 10101110 10110111	// “殷”的 UTF-8 编码,E6 AE B7,[-26,-82,-73]

ps:Unicode 只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方式。推荐的 Unicode 编码是 UTF-16 和 UTF-8。

Character Set

ps:有些编码格式带有 BOM 头(Byte Order Mark),就是文本文件中开始的几个并不表示任何字符的字节,用二进制编辑器可以看到(UTF-8 的 BOM 头为 0xEF 0xBB 0xBF,Unicode 大端模式为 0xFE 0xFF,Unicode 小端模式为 0xFF 0xFE)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值