计算机字符编码

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

字符集(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 007F 0xxxxxxx(兼容原来的 ASCII)
0000 0080—0000 07FF 110xxxxx 10xxxxxx
0000 0800—0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000—0010 FFFF 11110xxx 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。

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

字符集(Character Set)和字符编码(Character Encoding)相关推荐

  1. 关于Unicode,字符集,字符编码

    基本概念 字符[character] 字符代表了字母表中的字符,标点符号和其他的一些符号.在计算机中,文本是由字符组成的. 字符集合[character set] 由一套用于特定用途的字符组成,例如支 ...

  2. 字符集和字符编码(Charset Encoding)

    字符集和字符编码 一文参透字符编码的难题! 引子 在 python 中,处理字符串是常见任务,因为字符串编码问题,经常出现字符串乱码. 在 matplotlib 绘图时,text对象,如 axes_t ...

  3. php的内部方法编码方式,字符集字符编码以及PHP中的一些转码方法

    在重写一些老的项目的时候,有可能会遇到这种情况 ¾ÍÒµÖ¸µ¼ÖÐÐÄ2010Ä꺮¼Ù·Å¼Ù֪ͨ �����˵�λ������� ???????? 这就是传说中的乱码,要想处理乱码,得先了 ...

  4. 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类

    IO 文章目录 IO 简介 File 分隔符.大小写 常用方法 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 字节 ...

  5. 字符集与字符编码的基础知识

    字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集.ISO 8859字符集. ...

  6. 中文字符集与字符编码知识

    中文字符集与字符编码的基础知识 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII ...

  7. 字符集、字符编码编码总结:ANSI、UNICODE、MBCS、ASCII等等

    目录 一.字符集与字符编码 二.字符集的发展 1. 单字节字符集(SBCS) 2. 多字节字符集(MBCS) 3. 宽字节字符集(Unicode) 三.UTF - Unicode/UCS Transf ...

  8. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  9. 字符编码和字符集基础知识

    作者:  崔启亮  | 2005年07月05日13时20分 [内容提要]中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编 ...

最新文章

  1. 修改python编码
  2. mysql -uroot -proot tc -e select * from merchandise limit 1这个-E的命令作用是什么,用来什么什么的?
  3. 经常刷同一台POS机,信用卡会被降额吗?
  4. Map 遍历取值及jstl的取值
  5. leetcode1282. 用户分组(贪心算法)
  6. linux pwm 调屏_Linux驱动学习之:PWM驱动
  7. a king读后感 love of the_A华语电影高清合集
  8. SAP License:你熟悉SAP的统驭科目吗?
  9. 《Ray Tracing in One Weekend》——Chapter 12: What's next?
  10. Word制作音乐简谱(转)
  11. linux怎么修改数据库字段长度,Postsql 修改字段长度和类型
  12. 在matlab中产生dsp程序学习
  13. 逐点比较法的c语言编程,逐点比较法直线插补c语言程序
  14. hdu 1728:逃离迷宫
  15. 软件测试题目 如何测一个三角形,软件测试三角形问题(覆盖测试)
  16. Flutter Switch
  17. 27 周刊 | 这周我看到的?
  18. Gitea v1.17.0 正式发布 | 集成软件包管理器、容器镜像仓库
  19. 几何画板与运筹学作图注记
  20. 【转】几种小波阈值去噪程序

热门文章

  1. 系统可用性:SRE口中的3个9,4个9...到底是个什么东西?
  2. SystemVerilog学习-02-数据类型
  3. win7安装office2013过程中出现 office 15 click-to-run extensibility component提示
  4. 官方通报:kissreiko博文因涉嫌诈骗广告 将永久封号
  5. 滴滴柳青:一个比你有才,又比你努力的富二代!
  6. 3.5主存储器与CPU的连接
  7. 深度学习笔记其三:多层感知机和PYTORCH
  8. 媒体文件格式分析FMP4
  9. 6-3 BMI计算(类与对象) (10分)
  10. English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三