联系生活,浅谈Unicode基础知识

1、什么是Unicode

Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
(摘自百度百科)

(以下是个人理解)
我们在电脑中看到的字符大多都是Unicode编码的。
Unicode对世界上所有我们认识的字符都用了一个独一无二的ID来进行记录。
这就是码点(Code Point,以下简称CP),相当于我们人的身份证号码都是独一无二的。
再具体一点,我们汉字的“字”的码点就是23383(十进制),也就是23383就是“字”这个字符的身份证。

2、什么是UTF?

UTF 即 Unicode Transformation Formats。
翻译过来是 Unicode转换格式
知道这个,我们就会知道所谓的UTF-8、UTF-16、UTF-32其实只是Unicode的一些附属品而已,他们的父亲就是Unicode。

我们常说UTF-8编码,Unicode编码,其实这两个东西的分量是不一样的,UTF-8只是转换格式,从本质来讲,Unicode才是编码

2.1、为什么要使用UTF?

要知道这个,我们首先要知道Unicode现在已经扩展到21位了,而并非16位。

这个Unicode转换格式(UTF)的存在是为了解决码点(CP)在计算机中的二进制表现形式而设计的

毕竟我们的机内表示涉及存储位宽,兼容古老编码格式,码点是数值过大的罕见字符等问题。

联系生活:
我们在生活中,如果我们要辨识一个人,每一次都要用身份证的全部号码才能确认,那是不是非常麻烦?电话号码也是如此,我们更加常用电话号码后4位来标识一台手机。

2.2、什么是码元?

码元(Code Unit,以下简称CU)就是码点(之前说的CP)经过映射后得到的二进制串转换格式单位。

请记住:
码点(CP)是爸爸,是独一无二的,无论码元(CU)怎么变。
有上面这句话,我们就可以知道码元(CU)可以千变万化,子子孙孙开枝散叶,不过万变不离其宗。

那么,我们假设:
码点(CU)爸爸有N个字节,码元(CP)儿子规定是8个位(即1个byte),那么我们就可以知道码元爸爸其实是有N个码元儿子的。

2.3、编码平面

在讲UTF系列之前,还要讲讲编码平面。

这个玩意看起来很高大上。

我的理解是,他是一种对字符的分类

上面说过,Unicode现在是有21位的,提这 21 位提供了 1,114,112 个码点(CP)爸爸。

联系生活:
我们世界上有这么多的人,我们也是要划分不同国家生活的吧,所以有美国人,中国人,日本人…

编码平面设计出来就是干这个事情。

Unicode一共设计了17个平面。(可以理解为地球划分了17个国家)

欸?为什么是17个?

因为Unicode每个平面有 65,536 个字符(正好填充2个字节,16位),也就是说Unicode地球上每个国家只能住65,536人,不能再多了。

那我们21位减去16位,得到5。

2的5次方 = 32。

也就是说,其实Unicode地球是可以划分32个平面(国家)的,只是我们现在还没有这么多字符(人),暂时不需要划分这么大,留给以后的字符扩展。

还需要了解的是:

0 号平面叫做「基本多文种平面」( BMP, Basic Multilingual Plane ),涵盖了几乎所有你能遇到的字符.

我们老喜欢发的表情(emoji),是在1号平面的,其他平面都是补充平面,大部分都是空的。

2.4、UTF-32

最简单粗暴的一种Unicode转换格式。

我们都知道Unicode现在只有21个位数。

那么用32位来表达Unicode真的就是杀鸡用牛刀,过分浪费了,所以UTF-32是非常少用的。

2.5、UTF-16

在这个Unicode转换格式中,我们规定码元(CU)儿子是一定只有16位的。

这个16位是不是也很熟悉?

对的!他就是为0 号平面量身定做的。

0号平面上的每一个字符都和一个码元(CU)儿子相对应。

问题来了?其他平面的字符也是字符呀?16位不够吧?

在UTF-16的解决方法是,用两个码元(CU)儿子来表示一个其他平面的字符。

也就是说,我们如果发一个在这里插入图片描述需要两个码元儿子(即32位,8个字节)

在Java虚拟机中,就是实用UTF-16来表示Char字符的。

2.6、UTF-8

在这个Unicode转换格式中,我们规定码元(CU)儿子是一定只有8位的。

UTF-8不是按照平面来做规则的。
他从 0 到 127 的这些码点爸爸直接映射成 1 个字节。

也就是0-127这些码元爸爸是天龙人,非常的优越,所以他们要享受更短的编码。

对于只包含这个范围字符的文本来说,这一点使得 UTF-8 和 ASCII 完全相同。

剩下1,920字符,需要两个码元儿子来表示(即16位,2个字节)

在0号平面甚至需要用三个码元儿子来表示(即24位,3个字节)
比如说我们的中文字符,UTF-8标准下,就是这样的。

其余平面的,就要四个码元儿子来表示了(即32位,4个字节)

UTF-8似乎是最常见的一种Unicode转换格式。为什么呢?

UTF-8 是基于 8 位的码元儿子的,因此它并不需要关心字节顺序,而且他也非常有效率(对于西方国家而言),让UTF-8成为存储和交流Unicode编码的最佳编码,是各种网络协议,文件格式,Web API上的标准。

3、写在最后

无论是哪一种Unicode转换格式,其实都是程序猿可以控制的,出现乱码不要慌,从编码层面仔细分析原因,一定会找出解决方案。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值