UTF8UTF16-和-Unicode-有什么联系

32次阅读

共计 1747 个字符,预计需要花费 5 分钟才能阅读完成。

UTF-8、UTF-16 和 Unicode 有什么联系

起源

在计算机发明之初,由于计算机只能存储二进制的数据,美国人民为了交流通信方便,约定了一个编码规范,也就是 ASCIIAmerican Standard Code for Information Interchange: 美国信息交换标准代码);

ASCII 是基于拉丁字母的一套电脑编码系统,是 单字节 编码,主要用于显示现代英语和其他西欧语言。
它使用 7 位二进制数(剩下的 1 位二进制为 0)来表示所有的大写和小写字母,数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。

随着计算机传到了欧洲,发现很多符号(法语,德语等)没办法用 ASCII 表示,于是欧洲人自己也撸了一套编码,也就是 ISO/IEC 8859-1

ISO/IEC 8859-1 也是 单字节 编码,并且向下兼容 ASCII,其编码范围是 0x00-0xFF0x00-0x7F 之间完全和 ASCII 一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
ASCII 的区别体现在:ASCII是一个 7 位的容器,ISO-8859-1是一个 8 位的容器。

再后来,计算机就传入了中国,中国汉字少说就有几万,常用的就有几千个了。如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和 ASCII 编码冲突,所以,中国制定了 GB2312 编码,用来把中文编进去。于是乎,我们就撸出了一套GBK,并向下兼容ASCII

GBK 全称《汉字内码扩展规范》(GBK 即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification),采用 双字节 编码,其编码范围从 8140 至 FEFE(剔除 xx7F),共 23940 个码位,共收录了 21003 个汉字,完全兼容 GB2312-80 标准,支持国际标准 ISO/IEC10646- 1 和国家标准 GB13000- 1 中的全部中日韩汉字,并包含了 BIG5 编码中的所有汉字。

这时国际组织看不下去了,要是这样下去每个地区都出一套自己的编码,那还得了。于是乎撸了一套把大家的编码都归纳进去的编码,也就是 unicode 编码

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 只是一种 字符码表 ,而在计算机中进行存储时,必须指定一种具体的存储方式。常见的如utf8, utf16, utf32 等。

UTF—8

UTF—8(8-bit Unicode Transformation Format),以 8 位无符号整数为单位对 Unicode 进行编码。

UTF-8 的特点是对不同范围的字符使用不同长度的编码,是一种变长编码,对于一个 Unicode 的字符被编码成 1 至 4 个字节。对于 0x00-0x7F 之间的字符,UTF-8 编码与 ASCII 编码完全相同。

UTF- 8 编码的最大长度是 4 个字节,即可以容纳 21 位二进制数字。而 Unicode 的最大码位 0x10FFFF 也只有 21 位。

UnicodeUTF-8
U+0000 – U+007F0xxxxxxx
U+0080 – U+07FF110xxxxx 10xxxxxx
U+0800 – U+FFFF1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

一个字节的 uft8 表示的 unicode 码范围为(0 ~0x7F)

两个字节长度的 uft8 表示的 unicode 码范围为(0x80 ~ 0x07FF)

三个字节长度的 uft8 表示的 unicode 码范围为(0x0800 ~ 0xFFFF)

四个字节长度的 uft8 表示的 unicode 码范围为(0x10000 ~ 0x10FFFF)

UTF—16

UTF—16(16-bit Unicode Transformation Format),以 16 位无符号整数为单位对 Unicode 进行编码。

UTF-16 也是一种变长编码,对于一个 Unicode 的字符被编码成 1~2 个 code unit,每个code unit 使用 16 位(2 个字节)。

正文完
 0