前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是字符集?

什么是字符集?

作者头像
bisal
发布2019-06-19 18:29:59
1.2K0
发布2019-06-19 18:29:59
举报
文章被收录于专栏:bisal的个人杂货铺

无论是数据库,还是应用服务器,有时会碰见字符集的问题,就有些懵圈。看见CSDN转载了程序员乔戈里的一篇文章,用漫画的形式,讲解了各种字符集的知识,通俗易懂。

640?wx_fmt=jpeg
640?wx_fmt=jpeg

当天下午

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

————————

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

什么是编码空间呢?前面说了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号平面--。其它平面叫做补充平面,大多是空的。

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

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

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档