和田做网站的联系电话,厦门哪家做网站好,最近发生的重大军事新闻,不是用于制作网页的软件上一篇《字符编码发展史3 — GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。
2.3. 第三个阶段 国际化
前面提到的第二个阶段#xff0c;各个国家和地区各自为政#xff0c;纷纷…上一篇《字符编码发展史3 — GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。
2.3. 第三个阶段 国际化
前面提到的第二个阶段各个国家和地区各自为政纷纷制定了适用于自己国家语言的字符编码统称为ANSI码确实能解决该地区范围内语言文字的信息化处理。
随着互联网的普及和全球网络的互联互通计算机的信息经常需要在全球范围内进行分享和传输。这时这些只兼容ASCII码互相之间却不兼容的字符编码就暴露了巨大的缺陷编码混乱这个混乱常体现在以下几点
文本信息是一个国际化的内容包含了多种不同的语言时根本找不到一个合适的编码。如你的内容里既有西欧的法语又中国的汉字包含西欧语言的ISO 8859-1不支持中国的汉字包含中国汉字的GB 18030不支持西欧的字符。编码和解码使用的编码方式不一致时会出现乱码。如以下两种场景
数据在网络传输时数据发送用了A编码假设是ISO 8859-1数据接收时误用了B编码假设是GB 18030去解码就会出现乱码。网上下载了一个纯文本的txt文档里面保存内容的编码方式和本地计算机的默认编码不一致也会出现乱码。这时你可能还根本不知道这个文档采用的编码是什么只能靠猜测然后通过工具去手动转换编码格式。
为了解决ANSI系列编码的缺陷使国际间信息交流更加方便国际标准化组织ISO和统一码联盟Unicode Consortium共同制定的一个国际标准字符集Unicode。Unicode为各种语言中的每一个字符设定了统一并且唯一的数字编号以满足跨语言、跨平台进行文本转换、处理的要求。
2.3.1. Unicode与UCS
2.3.1.1. 什么是Unicode与UCS
这里讲一个冷知识历史上存在两个独立的尝试创立单一字符集的组织即 国际标准化组织(ISO)和统一码联盟(Unicode Consortium)。
国际标准化组织 制定了UCS标准(全称Universal Character Set)最初称为ISO/IEC 10646。统一码联盟 制了Unicode标准旨在解决不同字符编码之间的兼容性问题。
随着时间的推移国际标准化组织和统一码联盟意识到各自的标准在目标上是一致的因此决定合作将UCS和Unicode合并为一个统一的标准。从Unicode 2.0开始Unicode标准与ISO/IEC 10646标准保持同步两者在字符集和编码方案上基本一致。
所以你可以理解为Unicode和UCS是同一个东西国际标准字符集。现在几乎统一用Unicode一词UCS用的越来越少了。
Unicode是一个字符集不是编码方式又称统一码、万国码、单一码、标准万国码其实都是同一个东西不同的叫法。它收集了世界上几十种文字系统几乎包含了世界上用到的所有字符。截止2024年9月Unicode的最新的版本是16.0.0发布于2024年9月10日总共收录了154,998个字符。Unicode 16.0.0标准的官方文档参见https://www.unicode.org/versions/Unicode16.0.0/
Unicode的编码方式有三种UTF-8、UTF-16、UTF-32。其中UTF-16、UTF-32又分为大端和小端两种。
2.3.1.2. Unicode字符集的码点编号
Unicode字符集给每个字符根据其所在的码点分配了一个唯一的码点值即码点编号也叫字符编号格式为UXXXX其中XXXX为四位十六进制数字。比如U0041这个码点编号表示英语大写字母A。
Unicode的编码空间将所有字符按照使用的频率划分为17个平面(plane)每个平面包含2^16(65536)个码位将来根据需要还可扩展为更多平面。17个平面的码位可表示为从U0000到U10FFFF共计1114112个码位。
第0个平面称为基本多语言平面(Basic Multilingual Plane)简称基本平面(BMP)或称第零平面(Plane 0)码点区间U0000~UFFFF。它涵盖了当今世界上正在使用的最常用字符我们平常用到的大多数常见字符就是在BMP平面上。BMP平面以外的其他平面叫增补平面(Supplementary Planes)也称为辅助平面。
Unicode字符集中的U0000~U007F(即十进制的0~127)跟ASCII表示的字符是一致的U0000~U00FF(即十进制的0~255)跟ISO 8859-1字符集(即Latin-1字符集)也是一致的。所以Unicode的码点编号是兼容ASCII和ISO 8859-1的。
BMP平面中有一个私用区(即PUAPrivate Use Area或写作PUZPrivate Use Zone)0xE000~0xF8FF共6400个码点被保留为私用Unicode官方未将之分配给任何Unicode字符。还有一个代理区(Surrogate Zone)0xD800-0xDFFF共2048个码点代理区的码点不定义任何字符目的是用基本平面BMP中的两个码点“代理”表示BMP以外的其他增补平面中的字符后文UTF-16中会详细讲解。
Unicode实际上共定义了三个私用区除了上面提到的BMP的0xE000~0xF8FF还有两个分别是第15平面的UF0000~UFFFFD和第16平面的U100000~U10FFFD这两个私用区几乎包含了整个第15平面和第16平面。私用区相当于是可以由Unicode官方之外的个人和机构自由定义字符的特殊区域因此私用区中的同一个码点可被分配给不同的字符具体是哪个字符取决于用户使用的字体文件从而导致不同的用户由于安装了不同的字体文件有可能所看到的私用字符也不同。
2.3.2. Unicode的编码方式
对于被Unicode收录的字符其编号(即码点编号)是唯一且确定的。但是Unicode的编码实现方式(出于传输、存储、处理或向后兼容的考虑)却有不同的几种UTF-8、UTF-16、UTF-32。其中UTF的全称是Unicode Transformation Format表示“Unicode码转换格式”。其中8/16/32分别表示8位(1字节)/16位(2字节)/32位(4字节)表示一个字符进行编码所需的最小字节单元也称编码单元简称码元。
2.3.2.1. UTF-8
1. UTF-8的编码规则
UTF-8是一种变长编码对于一个Unicode的字符被编码成1至4个字节。Unicode编码与UTF-8的编码的对应关系如下表。
Unicode编码十进制表示UTF-8编码(二进制)U0000 – U007F0 ~ 1270xxxxxxxU0080 – U07FF128 ~ 2047110xxxxx 10xxxxxxU0800 – UFFFF2048 ~ 655351110xxxx 10xxxxxx 10xxxxxxU10000 – U10FFFF65536 ~ 209715111110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0、110、1110、11110以及10相当于UTF-8编码中各个字节的前缀因此称之为前缀码。他们的含义分别如下
0: 表示单字节编码单字节时表明该字符是一个ASCII字符。110: 表示双字节编码出现在双字节编码的首字节。1110: 表示三字节编码出现在三字节编码的首字节。11110: 表示四字节编码出现在四字节编码的首字节。10: 表示该字符是一个多字节编码2、3、4字节10是多字节编码中非首字节的前缀。
UTF-8编码中的前缀码起到了很好的区分和标识的作用其编码的解析过程大致如下
当解码程序读取到一个字节的首位为0表示这是一个单字节编码的ASCII字符当读取到一个字节的首位为1表示这是一个非ASCII字符的多字节编码字符中的某个字节(可能是首字节也可能是后续字节)接下来若继续读取到一个1则确定为首字节再继续读取直到遇见终结标志0为止读取了几个1就表示该字符为几个字节的编码当读取到一个字节的首位为1紧接着读取到一个终结标志0则该字节显然是非ASCII字符的后续字节(即非首字节)。
在UTF-8编码方式中绝大部分的中文用三个字节编码部分中文用四个字节编码举例如下:
Unicode字符UTF-8编码U0041A0x41U03A9Ω0xCE 0xA9U6653晓0xE6 0x99 0x93U2A6A5(四个龍)0xF0 0xAA 0x9A 0xA5
2. UTF-8的优缺点
优点: 向后兼容ASCII编码没有字节序(大小端)的问题适合网络传输存储英文和拉丁文等字符非常节省存储空间。 缺点: 变长编码不利于文本处理对于CJK等文字比较浪费存储空间。 未完待续…… 欲知后事如何且看下回分解。 下回预告字符编码发展史5 — UTF-16和UTF-32。 历史文章推荐 字符编码发展史3 — GB2312/Big5/GBK/GB18030 字符编码发展史2 — ISO-8859-N 字符编码发展史1 — ASCII和EASCII 大家好我是陌尘。
IT从业10年, 北漂过也深漂过目前暂定居于杭州未来不知还会飘向何方。
搞了8年C也干过2年前端用Python写过书也玩过一点PHP未来还会折腾更多东西不死不休。
感谢大家的关注期待与你一起成长。 【SunLogging】 扫码二维码关注微信公众号精彩内容