赞
踩
Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
(摘自百度百科)
(以下是个人理解)
我们在电脑中看到的字符大多都是Unicode编码的。
Unicode对世界上所有我们认识的字符都用了一个独一无二的ID来进行记录。
这就是码点(Code Point,以下简称CP),相当于我们人的身份证号码都是独一无二的。
再具体一点,我们汉字的“字”的码点就是23383(十进制),也就是23383就是“字”这个字符的身份证。
UTF 即 Unicode Transformation Formats。
翻译过来是 Unicode转换格式
知道这个,我们就会知道所谓的UTF-8、UTF-16、UTF-32其实只是Unicode的一些附属品而已,他们的父亲就是Unicode。
我们常说UTF-8编码,Unicode编码,其实这两个东西的分量是不一样的,UTF-8只是转换格式,从本质来讲,Unicode才是编码
要知道这个,我们首先要知道Unicode现在已经扩展到21位了,而并非16位。
这个Unicode转换格式(UTF)的存在是为了解决码点(CP)在计算机中的二进制表现形式而设计的
毕竟我们的机内表示涉及存储位宽,兼容古老编码格式,码点是数值过大的罕见字符等问题。
联系生活:
我们在生活中,如果我们要辨识一个人,每一次都要用身份证的全部号码才能确认,那是不是非常麻烦?电话号码也是如此,我们更加常用电话号码后4位来标识一台手机。
码元(Code Unit,以下简称CU)就是码点(之前说的CP)经过映射后得到的二进制串转换格式单位。
请记住:
码点(CP)是爸爸,是独一无二的,无论码元(CU)怎么变。
有上面这句话,我们就可以知道码元(CU)可以千变万化,子子孙孙开枝散叶,不过万变不离其宗。
那么,我们假设:
码点(CU)爸爸有N个字节,码元(CP)儿子规定是8个位(即1个byte),那么我们就可以知道码元爸爸其实是有N个码元儿子的。
在讲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号平面的,其他平面都是补充平面,大部分都是空的。
最简单粗暴的一种Unicode转换格式。
我们都知道Unicode现在只有21个位数。
那么用32位来表达Unicode真的就是杀鸡用牛刀,过分浪费了,所以UTF-32是非常少用的。
在这个Unicode转换格式中,我们规定码元(CU)儿子是一定只有16位的。
这个16位是不是也很熟悉?
对的!他就是为0 号平面量身定做的。
0号平面上的每一个字符都和一个码元(CU)儿子相对应。
问题来了?其他平面的字符也是字符呀?16位不够吧?
在UTF-16的解决方法是,用两个码元(CU)儿子来表示一个其他平面的字符。
也就是说,我们如果发一个需要两个码元儿子(即32位,8个字节)
在Java虚拟机中,就是实用UTF-16来表示Char字符的。
在这个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上的标准。
无论是哪一种Unicode转换格式,其实都是程序猿可以控制的,出现乱码不要慌,从编码层面仔细分析原因,一定会找出解决方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。