当天下午

————————

在计算机底层,比如说你的名字“小萌”在计算机中并不是文字的形式,而是一串二进制数字,如“011001100110…”

人类只认识文字,可惜计算机只认 0 和 1,双方都不能妥协,那就必须要有一个从文字到 0、1 的映射了。

从我们可以看到的文字到 0、1 的映射称为编码,反过来从 0、1 到文字叫解码。这个就是编码的含义。

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用 8 个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是 255(二进制11111111=十进制 255),0 - 255 被用来表示大小写英文字母、数字和一些符号,这个编码表被称为 ASCII 编码,比如大写字母 A 的编码是 65,小写字母 z 的编码是 122。

Unicode 编码定义了这个世界上几乎所有字符(就是你眼睛看的字符,比如ABC、汉字等)的数字表示,而且 Unicode 还兼容了很多老版本的编码规范,例如刚刚讲过的 ASCII 码。

我们国家的每一个人都对应唯一的一个身份证号,而 Unicode 也为每个字符发了一张身份证,这张“身份证”上有一串唯一的数字 ID 确定了这个字符。

这串数字在整个计算机的世界具有唯一性,Unicode 给这串数字 ID 起了个名字叫[码点]。

这个“Unicode 转换格式”是为了解决“码点”在计算机存储方式而设计的。

“码点”经过映射后得到的二进制串的转换格式单位称之为“码元”(Code Unit)。“码点”就是一串二进制数,“码元”就是切分这个二进制数的方法。

举个例子,如果有一个字符的码点二进制表示有 n 字节(n*8 个二进制数),其码元为 8 位(1 个字节),那么其拥有码元 n 个。

Unicode 编码发展到今天扩展到了 21 位,为啥扩展到 21 位了呢?因为一开始老美只考虑自己那 26 个英文字母和数字,随着越来越多的国家的语言语言编码,Unicode 不得继续扩展,目前 21 位已经足够使用。

UTF-32 是最好理解的一个了。UTF-32 也就是说它的码元是 32 位,每 32 位去读一下码点,而码点是 Unicode 给字符的编码,前面也说了,最长才 21 位,因此每一个 UTF-32 值都可以直接表示对应的码点。

什么是编码空间呢?前面说了 Unicode ,它是 21 位的。这 21 位提供了 1,114,112 个码点,编码空间就是对应这 1,114,112 个码点。

对了这里要说一下,这么多码点并不代表有这么多字符,目前大概只有 10% 的空间被使用了,人类社会还没创造出 1,114,112 这么多的字符。

编码空间被分成 17 个平面(plane),每个平面有 65,536 个字符(正好填充 2 个字节,16 位)。0 号平面叫做“基本多文种平面”(BMP, Basic Multilingual Plane),涵盖了几乎所有你能遇到的字符,除了 emoji(emoji 位于 1 号平面 - -)。其它平面叫做补充平面,大多是空的。

UTF-16 要常见得多,它的码元是 16 位的,也就是说每 16 位去读一下码点,获取码点的前 16 位数字,直到读取完成。

编码空间这里要用上了哈,BMP 平面(也就是前面说的基本多文种平面)中的每一个码点都直接与一个 UTF-16 的码元一一映射。

由于 BMP 几乎包括了所有常见字符,UTF-16 一般需要 UTF-32 大约一半的空间。至于其它平面里很少使用的码点都是用两个 16 位的码元来编码的。

UTF-8 使用一到四个字节来编码一个码点。从 0 到 127 的这些码点直接映射成 1 个字节(对于只包含这个范围字符的文本来说,这一点使得 UTF-8 和 ASCII 完全相同)。接下来的 1,920 个码点映射成 2 个字节,在 BMP 里所有剩下的码点需要 3 个字节。Unicode 的其他平面里的码点则需要 4 个字节。UTF-8 是基于 8 位的码元的,因此它并不需要关心字节顺序(因为字节就是 8 位的呀,其它 UTF-16 和 UTF-32 在不同的机器编译环境下需要考虑字节的顺序问题)。

作者:乔戈里,哈工大计算机本硕,百度工程师,做公众号就是想和大家交个朋友。

免责声明:本文为作者投稿,内容版权归作者所有,文中所使用卡通形象来源于网络,CSDN 发布此文出于传递更多信息之目的,CSDN 不因此向用户承担任何责任。


 热 文 推 荐 

☞ Android 要收费?周鸿祎:这是迟早的事!

☞ 程序员版“吐槽大会”: 国产综艺节目年终盘点

☞ AI 外挂!百度 Lens 是如何突破人眼视觉极限的?

☞ 比特币拒绝第340次“被死亡”

☞ 有问有答 | 分布式服务框架精华问答

程序员有话说 | 大专生毕业 6 年月薪 3W+:不从众也不普通

☞ 网友们票选的2018 Best Paper,你pick谁?

☞ 老程序员肺腑忠告:千万别一辈子靠技术生存!

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

点击“阅读原文”,打开 CSDN App 阅读更贴心!

喜欢就点击“好看”吧!

漫画:什么是字符集和编码?ASCII、UTF-8、UTF-16、UTF-32 又是什么?相关推荐

  1. 字符集和编码规范:ASCII,Unicode和UTF-8, latin1,BIG5,GBK

    字符集和编码方式:ASCII,Unicode和UTF-8, latin1,BIG5,GBK 参考: 字符集 字符集编码详解 一. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制 ...

  2. 你不知道的 字符集和编码(编码字符集与字符集编码)

    我的上篇文章,有朋友提出字符集和编码的区别,我在此立文和大家讨论下 常说的字符集和编码区别,其实就是编码字符集和字符集编码的区别,其实,单单如果只是说字符集,没有任何编码的概念的话,那么字符集其实仅仅 ...

  3. Ruby:字符集和编码学习总结

    背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...

  4. 创建数据库,指定数据库的字符集和编码顺序

    创建数据库,指定它的字符集和编码顺序 create database {数据库名称} CHARACTER SET {字符集} COLLATE {排序规则} 举例: create database co ...

  5. 面试题字符集和编码区别_您和理想工作之间的一件事-编码面试!

    面试题字符集和编码区别 A recruiter calls you for a position with your dream company. You get extremely excited ...

  6. [转]各种字符集和编码详解

    在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了, ...

  7. 各种字符集和编码详解

    在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这 个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了 ...

  8. 字符集和编码 UNICODE、ANSI、UTF-8、GB2312 都是什么鬼

    这是我在网上看到的一篇通俗易懂的教程,但是无法找到原作者的署名,故直接搬过来了 不是本人所作,特此声明 快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char ...

  9. 【字符集】字符集和编码知识【转】

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

最新文章

  1. python数据库框架_Python数据库及ORM框架对比选择
  2. 数据分析之Pandas分组操作总结
  3. Trie:hdu 4825、1251、1247、Poj 3764
  4. 第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :
  5. 学成在线--18.新增课程(课程分类查询)
  6. UE3 体积感光束教程
  7. shell 特殊符号
  8. centos directory server
  9. Win11如何提高游戏性能?Win11提升游戏性能的方法
  10. SQLite第九课 sqlite3_set_authorizer案例
  11. js模块化开发——模块的写法
  12. Springboot整合Drools规则引擎
  13. 08 计算机视觉-opencv直方图与傅里叶变换
  14. Python基础-Python中列表的使用
  15. 新媒体运营胡耀文教程:从运营角度,教你4招破解销售推销套路
  16. 个人企业信息多用户入驻智能电子名片小程序开发
  17. uni-app实现实时获取当前时间日期
  18. Gartner:2017年中国新兴技术成熟度曲线
  19. C++ std::numeric_limits
  20. HDU 2448 最短路+KM匹配

热门文章

  1. pythonic code_Pythonic Code (Part III)
  2. 剑指Offer之不用加减乘除做加法
  3. Material Design设计技巧
  4. c语言 linux sd_Linux内核组成部分(二)
  5. 使用率激增250%,这份报告再将 Serverless 推向幕前
  6. 超越Tiny-YOLO V4,全新设计轻量化YOLO模型实现边缘实时检测!!!
  7. 用 65 行代码实现 JavaScript 动画序列播放
  8. 130 行代码模仿火爆抖音的“蚂蚁呀嘿”特效,你学会了吗?
  9. A 股 30 年终迎教育公司 IPO,“旧金山”投资人浮出水面
  10. 致敬HarmonyOS不平凡的2020,热情背后还有多少期待