先说一下,为什么写这篇文章?

最近在写一个Http协议栈当涉及CRLF控制字符写入时,发现自己对CRLF\r\n的关系不太了解,因此决定详细学习一下;查阅资料的同时,又遇到UTF-8ASCII编码的疑问。

一、ASCII 编码

ASCII (American Standard Code for Information Interchange 美国信息交换标准代码) 由128个字符构成,是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语,其对应的国际标准为 ISO/IEC 646

ASCII 由电报码发展而来,第一版标准发布于1963年,最后一次更新则是在1986年,至今为止共128个字符

  • 其中33个字符为不可显示的控制字符,主要用于控制设备或调整文本格式;
  • 在33个字符之外是95个可显示字符

    包含26个英文大小写字母10个阿拉伯数字以及包含空格在内的33个标点与特殊符号

1.1 EASCII

EASCII(Extended ASCII)是ASCII码的扩展版本,其将ASCII码由7位扩充为8位,由128个字符扩展为256个字符,因此EASCII可以部分支持西欧语言。

1.2 转义字符

ASCII码表中的转义字符是一种约定写法,是以反斜杠\开头的特殊字符序列,作用是告诉计算机如何显示与输入控制字符。

转义字符的由来可以追溯到电传打字机和电传打字设备的使用。

在这些设备中,许多字符都是由多个部分组成的,需要多次按键才能输入。例如,换行符通常需要按下回车键和换行键,而退格符需要按下后退键。为了简化这个过程,制定了一些简化输入这些字符的规则,这些规则最终成为了ASCII转义字符的标准。

转义字符并非ASCII控制字符的某种编码方式,而是一种约定俗成的写法。当向计算机输入转义字符时(如\r\n),其将自动将转移字符替换为CRLF控制字符。

以下使用Java语言编写了一个测试程序,当计算机遇到\r\n时,计算机自动将其替换为了CRLF控制字符,每个控制字符占一个字节

二、Unicode 编码

Unicode (The Unicode Standard) 译作万国码、统一字元码、统一字符编码,是信息技术领域的业界标准,其整理、编码了世界上大部分的文字系统,使得电脑能以统一字符集来处理和显示文字,不但减轻在不同编码系统间切换和转换的困扰,更提供了一种跨平台的乱码问题解决方案。

Unicode由非营利机构Unicode联盟(Unicode Consortium)维护,该机构致力让Unicode标准取代既有的字符编码方案,因为既有方案编码空间有限,不适用于多语环境。Unicode伴随着通用字符集ISO/IEC 10646的标准而发展,同时也以书本的形式对外发表。Unicode至今仍在不断增修,每个新版本都加入更多新的字符,目前最新的版本为2022年9月公布的15.0.0,已经收录超过14万个字符

Unicode 编码是一个二进制字符集,其字符占用2~3个字节。目前分为17个组进行编排,每个组称为一个平面,每个平面拥有65536个编码点,且当前只使用了少数平面。

因此,Unicode有足够的编码空间,可以将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,是名副其实的万国码。

三、UTF-8 编码

UTF-8的英文全称是(8-bit Unicode Transformation Format),其为 Unicode 的实现方式之一,也是目前互联网上使用最广的一种 Unicode 编码的实现方式。

为什么UTF-8成为互联网使用最广泛的一种编码方式?

前边说过Unicode 编码是一个二进制字符集,其只规定了字符的二进制代码,却没有规定这些二进制代码应该如何存储。

比如:

  • 大写英文字母A,其对应的ASCII二进制编码为8位 ( 01000001 ),也就是说表示ASCII字符需1个字节 ;
  • 汉字的 Unicode 十六进制标识为590F,二进制表示有16位(0101100100001111),也就是说采用Unicode表示这个字符至少需要2个字节;
  • 而对于Unicode编码第14~16平面的字符,可能需要3个字节表示。

因此,在计算机中如何进行Unicode编码的存储,出现了以下两个问题:

  • 若所有的字符均按3个字节进行表示:由于计算机存储空间有限,将造成不小的空间浪费;
  • 若按1~3字节对所有字符进行表示:计算机该如何区分ASCII 与 Unicode(计算机如何知道是一个字节表示一个字符,还是三个字节表示一个字符)?

在这种情况下UTF-8应运而生,UTF-8 最大的特点是一种可变长的编码方式,其使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。

    因此,对于英语字母UTF-8 编码和 ASCII 码是相同的。
  • 对于n字节的符号(n > 1):

    第一个字节的前n位都设为1,第n + 1位设为0

    后面字节的前两位一律设为10

    剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

下表总结了编码规则,字母x表示可用编码的位:

Unicode符号范围        |   UTF-8编码方式
(十六进制) | (二进制)
----------------------+----------------------------------
0000 0000 ~ 0000 007F | 0xxxxxxx
0000 0080 ~ 0000 07FF | 110xxxxx 10xxxxxx
0000 0800 ~ 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 ~ 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8编码为什么最多占用4个字节?

前边我们了解到 Unicode 编码的17个平面,最多使用3个字节可全部表示。但为什么 UTF-8 编码最多却是要使用4个字节呢?

这是由 UTF-8 编码的编码规则决定的,对于编码点 U+10000 到 U+10FFFF 范围内的字符,UTF-8 编码使用了 4 个字节来表示。

Unicode符号范围        |   UTF-8编码方式
(十六进制) | (二进制)
----------------------+----------------------------------
0001 0000 ~ 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

其中:

  • 前面的字节以“11110”开始,用于标识使用了 4 个字节来表示一个字符。
  • 后面的 3 个字节的前两个字节以“10”开始,用于标识这是一个多字节字符的后续字节。

使用四个字节的好处还在于,可以为未来的 Unicode 字符预留更多的编码空间。这是因为,Unicode 是一个持续发展的标准,每年都有新的字符被添加到其中。如果所有的字符都只使用三个字节表示,那么当 Unicode 标准新增更多字符时,就会出现编码空间不足的问题。因此,使用四个字节来表示这些字符可以保证未来的字符也能够被正确编码。

参考

wikipedia ASCII:

https://zh.wikipedia.org/zh-hans/ASCII

wikipedia Unicode:

https://zh.wikipedia.org/zh-cn/Unicode

wikipedia Unicode字符平面映射:

https://zh.wikipedia.org/zh-hans/Unicode%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84

wikipedia UTF-8:

https://zh.wikipedia.org/wiki/UTF-8

ISO/IEC 646 ASCII:

http://www.kostis.net/charsets/iso646.irv.htm

ISO/IEC 10646 Unicode:

http://www.kostis.net/charsets/iso10646.htm

ascii-code:

https://www.ascii-code.com/

Unicode 编码表:

http://www.chi2ko.com/tool/CJK.htm

ASCII Unicode 和 UTF-8:

https://blog.csdn.net/qq_38310578/article/details/78433726

= THE END =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

一文读懂字符编码ASCII、Unicode与UTF-8的更多相关文章

  1. 字符编码 ASCII,Unicode和UTF-8的关系

    转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143166410626 ...

  2. 字符编码 ASCII unicode UTF-8

    字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(b ...

  3. 一文读懂Base64编码

    Base64编码 字符对应表 上表就是用来表示Base64,一共64个字符,A-Z,a-z,0-9,+,-,还有=(作为补位) 无论将文件,字符串,还是什么转为Base64,一定是用上表的字符表示. ...

  4. 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, Utf-8

    彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, U 1.ASCII: 0-127(128-255未使用),美国标准 2.IS0-8859-1(lati ...

  5. 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HT ...

  6. [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路   http://www.52im.net/thread-1709-1-2.html     本文原作者阮一峰,作者博客:r ...

  7. [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图

    MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...

  8. 大数据篇:一文读懂@数据仓库(PPT文字版)

    大数据篇:一文读懂@数据仓库 1 网络词汇总结 1.1 数据中台 数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念. 数据中台是一套可持续"让企业的数据用起 ...

  9. 一文读懂HTTP/2及HTTP/3特性

    摘要: 学习 HTTP/2 与 HTTP/3. 前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何 ...

  10. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现

    一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现 导读:近日,马云.马化腾.李彦宏等互联网大佬纷纷亮相2018世界人工智能大会,并登台演讲.关于人工智能的现状与未来,他们提出了各自的观点,也引 ...

随机推荐

  1. 杭电oj 多项式求和

    Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...现在请你求出该多项式的前n项的和.   Input 输入数据由2行组 ...

  2. js 处理日期加减

    js 处理日期加减 开始时间设置为6点整,若当前时间小于6:00:00,则使用T-1,否则使用T 结束时间设置为T+1的6点整 Date.prototype.format = function(fmt ...

  3. calibredrv命令

    flattencell: set L1 [layout create *.gds -dt_expand] $L1 flatten cell TOP_CELL_NAME $L1 gdsout ./*_f ...

  4. 教你三分钟开发开发java短信验证码

    现如今,绝大多数网站和app都需要支持手机号注册.手机登录,这就需要开发者实现短信验证码的功能,对于很多小白同学来说,没接触过,没有思路,下面小编就给大家详解一下. 发送短信的功能需要借助第三方的短信 ...

  5. 侠客行+越女剑 <随笔>

    侠客行:自己提炼剧情是一个很费时费劲的事情,好在剽窃百度百科不算抄袭,而且也足够还原,红字为补充 一向平静祥和的小市镇侯监集上,忽然来了二百多名杀人不眨眼的强盗.镇上乡亲们都熟悉的卖饼老者王老汉,却被 ...

  6. SQL-运算

    dual表可以进行运算select * from dual; 算数运算 + - * /select 5 + 6 as aaa ,6 - 3 as bbb ,5 * 7 as ccc ,9/2 as d ...

  7. SQL-建表注释

    ddl 是对表结构的操作 create(创建)命令.alter(修改)命令.drop(删除)dml 是对表数据的操作 insert(插入)命令.update(更新)命令.delete(删除) alte ...

  8. Unity中常用的几种读取本地文件方式

    使用的命名空间如下 using LitJson;using System.Collections.Generic;using System.IO;using System.Text;using Uni ...

  9. css中双冒号和单冒号区别

    :--是指的伪类 ::--是指的伪元素 1.字面意思: 伪类,1.css中有类选择器,某些元素并未定义类名,就可以通过伪类赋予样式,如:[:nth-child(n)]:2.伪类可以应用于元素执行某种状 ...

  10. 当你的数据集是hdf5格式的文件时,肿么办?

    最近,自己构建了一个卷积神经网络,从网上下载到的数据集是hdf5格式的,希望用这个数据集来训练一下自己构建的这个神经网络. 1. 什么是hdf5? HDF5是二进制数据格式,用于在磁盘上存储巨大的数值 ...