字符集(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字符集的衍生
- 当计算机开始发展起来的时候,发现ASCII 字符集里的 128 个字符已经无法满足需求。一个字节能够表示的数字(编号)有 256 个,而 ASCII 字符只用到了 0x00~0x7F,也就是占用了前 128 个,后面 128 个数字没有被利用。
- 因此很多人开始利用后面 128 个数字,但是不同人对这些数字分别对应什么样的字符的想法不同,这导致出现了大量各式各样的 OEM 字符集(对于 0x00~0x7F 这个范围的解释基本是相同的,而对于后半部分 0x80~0xFF 的解释却不一定相同,甚至有时候同样的字符在不同 OEM 字符集中对应的字节也是不同的),不同的 OEM 字符集导致人们无法跨机器交流各种文档。
多字节字符集(MBCS)和中文字符集
- 上面的字符集都是基于单字节编码,也就是一个字节翻译成一个字符。
- 但是对于亚洲国家来说,256 个字符是远远不够用的,因此就发明了多字节编码方式,相应的字符集就称为多字节字符集(Muilti-Bytes Charecter Set,保持和 ASCII 字符集的兼容)。
- 中国使用的就是双字节字符集编码。例如目前最常用的中文字符集 GB2312,涵盖了所有简体字符以及一部分其他字符;GBK(Guo-Biao Kuozhan)则在 GB2312 的基础上加入了对繁体字符等其他非简体字符(这两个字符集的字符都是使用 1-2 个字节来表示)。
- Windows 系统采用 936 代码页来实现对 GBK 字符集的编解码。在解析字节流的时候,如果遇到字节的最高位是 0 的话,那么就使用 936 代码页中的第 1 张码表进行解码,这就和单字节字符集的编解码方式一致了;如果遇到字节的最高位是 1 的话,那么就表示需要两个字节值才能对应一个字符。
示例:我叫ABC
11001110 11010010 10111101 11010000 01000001 01000002 01000003
ps:全角是一种电脑字符,且每个全角字符占用两个标准字符(或半角字符)位置。通常的英文字母、数字键、符号键都是半角的,半角的显示内码都是一个字节。为了排列整齐,英文和其它拉丁文的字符和标点也提供了全角格式。
ANSI标准、ISO标准、国家标准
- 不同 ASCII 衍生字符集的出现,让文档交流变得非常困难,因此各种组织都陆续进行了标准化流程。
- 美国 ANSI 组织制定了 ANSI 标准字符编码(我们现在通常说到 ANSI 编码,指的是平台的默认编码,例如英文操作系统中是 ISO-8859-1,中文系统是 GBK)。
- ISO 组织制定的各种 ISO 标准字符编码,例如ISO 10646标准为“通用字符集”(UCS,Universal Character Set)定义了一种16位的编码方式(即 UCS-2 )。
- 还有各国也会制定一些国家标准字符集,例如中国的 GBK,GB2312 和 GB18030。
ps:操作系统在发布的时候,通常会往机器里预装这些标准的字符集还有平台专用的字符集,这样只要你的文档是使用标准字符集编写的,通用性就比较高了。
Unicode字符集
- 虽然通过使用不同字符集,我们可以在一台机器上查阅不同语言的文档,但是如果一份文档中含有不同国家的不同语言的字符,那么无法在一份文档中显示所有字符。
- 为了解决这个问题,我们需要一个全人类达成共识的巨大的字符集,这就是 Unicode 字符集。
- Unicode 字符集涵盖了目前人类使用的所有字符,并为每个字符进行统一编号,分配唯一的字符码(Code Point)。
- Unicode 字符集将所有字符按照使用上的频繁度划分为 17 个层面(Plane),每个层面上有 216=65536 个字符码空间。其中第 0 个层面 BMP,基本涵盖了当今世界用到的所有字符。其他的层面要么是用来表示一些远古时期的文字,要么是留作扩展。我们平常用到的 Unicode 字符,一般都是位于 BMP 层面上的。目前 Unicode 字符集中尚有大量字符空间未使用。
ps:随着 Unicode 与 ISO 10646 合并统一,Unicode 就用 UCS 通用字符集标准,早期的 Unicode 编码实现也就采用了 UCS-2。
UTF-x字符编码
- 为解决 Unicode 如何在网络上传输的问题,出现了面向传输的众多 UTF(UCS Transfer Format)标准(UTF-8 就是每次 8 个位传输数据,而 UTF-16 就是每次 16 个位)。
- UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
- 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)相关推荐
- 关于Unicode,字符集,字符编码
基本概念 字符[character] 字符代表了字母表中的字符,标点符号和其他的一些符号.在计算机中,文本是由字符组成的. 字符集合[character set] 由一套用于特定用途的字符组成,例如支 ...
- 字符集和字符编码(Charset Encoding)
字符集和字符编码 一文参透字符编码的难题! 引子 在 python 中,处理字符串是常见任务,因为字符串编码问题,经常出现字符串乱码. 在 matplotlib 绘图时,text对象,如 axes_t ...
- php的内部方法编码方式,字符集字符编码以及PHP中的一些转码方法
在重写一些老的项目的时候,有可能会遇到这种情况 ¾ÍÒµÖ¸µ¼ÖÐÐÄ2010Ä꺮¼Ù·Å¼Ù֪ͨ �����˵�λ������� ???????? 这就是传说中的乱码,要想处理乱码,得先了 ...
- 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类
IO 文章目录 IO 简介 File 分隔符.大小写 常用方法 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 字节 ...
- 字符集与字符编码的基础知识
字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集.ISO 8859字符集. ...
- 中文字符集与字符编码知识
中文字符集与字符编码的基础知识 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII ...
- 字符集、字符编码编码总结:ANSI、UNICODE、MBCS、ASCII等等
目录 一.字符集与字符编码 二.字符集的发展 1. 单字节字符集(SBCS) 2. 多字节字符集(MBCS) 3. 宽字节字符集(Unicode) 三.UTF - Unicode/UCS Transf ...
- 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 普通的linux 和 普通的windows. ...
- 字符编码和字符集基础知识
作者: 崔启亮 | 2005年07月05日13时20分 [内容提要]中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编 ...
最新文章
- 修改python编码
- mysql -uroot -proot tc -e select * from merchandise limit 1这个-E的命令作用是什么,用来什么什么的?
- 经常刷同一台POS机,信用卡会被降额吗?
- Map 遍历取值及jstl的取值
- leetcode1282. 用户分组(贪心算法)
- linux pwm 调屏_Linux驱动学习之:PWM驱动
- a king读后感 love of the_A华语电影高清合集
- SAP License:你熟悉SAP的统驭科目吗?
- 《Ray Tracing in One Weekend》——Chapter 12: What's next?
- Word制作音乐简谱(转)
- linux怎么修改数据库字段长度,Postsql 修改字段长度和类型
- 在matlab中产生dsp程序学习
- 逐点比较法的c语言编程,逐点比较法直线插补c语言程序
- hdu 1728:逃离迷宫
- 软件测试题目 如何测一个三角形,软件测试三角形问题(覆盖测试)
- Flutter Switch
- 27 周刊 | 这周我看到的?
- Gitea v1.17.0 正式发布 | 集成软件包管理器、容器镜像仓库
- 几何画板与运筹学作图注记
- 【转】几种小波阈值去噪程序
热门文章
- 系统可用性:SRE口中的3个9,4个9...到底是个什么东西?
- SystemVerilog学习-02-数据类型
- win7安装office2013过程中出现 office 15 click-to-run extensibility component提示
- 官方通报:kissreiko博文因涉嫌诈骗广告 将永久封号
- 滴滴柳青:一个比你有才,又比你努力的富二代!
- 3.5主存储器与CPU的连接
- 深度学习笔记其三:多层感知机和PYTORCH
- 媒体文件格式分析FMP4
- 6-3 BMI计算(类与对象) (10分)
- English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三