论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
字符编码发展史4 — Unicode与UTF-8
字符编码发展史4 — Unicode与UTF-8
河曲智叟
论坛元老
|
2024-9-27 18:44:18
|
显示全部楼层
|
阅读模式
楼主
主题
1894
|
帖子
1894
|
积分
5682
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
上一篇《
字符编码发展史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字符集给每个字符根据其所在的码点分配了一个唯一的码点值,即
码点编号
,也叫
字符编号
,格式为:U+XXXX,其中XXXX为四位十六进制数字。比如,U+0041这个码点编号,表示英语大写字母A。
Unicode的编码空间将所有字符按照利用的频率分别为17个平面(plane),每个平面包含2^16(65536)个码位,未来根据必要,还可扩展为更多平面。17个平面的码位可表示为从U+0000到U+10FFFF,共计1114112个码位。
第0个平面称为基本多语言平面(Basic Multilingual Plane),简称
基本平面
(BMP),或称第零平面(Plane 0),码点区间:U+0000~U+FFFF。它涵盖了当今世界上正在利用的最常用字符,我们平常用到的大多数常见字符,就是在BMP平面上。BMP平面以外的其他平面叫
增补平面
(Supplementary Planes),也称为辅助平面。
Unicode字符集中的U+0000~U+007F(即十进制的0~127),跟ASCII表示的字符是一致的;U+0000~U+00FF(即十进制的0~255),跟ISO 8859-1字符集(即Latin-1字符集)也是一致的。所以Unicode的码点编号是兼容ASCII和ISO 8859-1的。
BMP平面中有一个
私用区
(即PUA:Private Use Area,或写作PUZ:Private Use Zone):0xE000~0xF8FF,共6400个码点,被保留为私用,Unicode官方未将之分配给任何Unicode字符。还有一个
代理区
(Surrogate Zone):0xD800-0xDFFF,共2048个码点,代理区的码点不定义任何字符,目的是用基本平面BMP中的两个码点“代理”表示BMP以外的其他增补平面中的字符(后文UTF-16中会详细讲解)。
Unicode实际上共定义了三个私用区,除了上面提到的BMP的0xE000~0xF8FF,还有两个分别是:第15平面的U+F0000~U+FFFFD和第16平面的U+100000~U+10FFFD,这两个私用区几乎包含了整个第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编码(二进制)U+0000 – U+007F0 ~ 1270xxxxxxxU+0080 – U+07FF128 ~ 2047110xxxxx 10xxxxxxU+0800 – U+FFFF2048 ~ 655351110xxxx 10xxxxxx 10xxxxxxU+10000 – U+10FFFF65536 ~ 209715111110xxx 10xxxxxx 10xxxxxx 10xxxxxx0、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编码方式中,绝大部门的中文用三个字节编码,部门中文用四个字节编码,举比方下:
[table][tr]Unicode字符UTF-8编码[/tr][tr][td]U+0041[/td][td]A[/td][td]0x41[/td][/tr][tr][td]U+03A9[/td][td]Ω[/td][td]0xCE 0xA9[/td][/tr][tr][td]U+6653[/td][td]晓[/td][td]0xE6 0x99 0x93[/td][/tr][tr][td]U+2A6A5[/td][td]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
河曲智叟
论坛元老
这个人很懒什么都没写!
楼主热帖
黑客常见攻击流程
为什么你的局域网需要https加密?怎么 ...
为什么一定要从DevOps走向BizDevOps? ...
Flutter项目打包生成APK
大数据 - ClickHouse
WebGL 及其在 WebRTC 中的应用
在K8S中,DaemonSet类型资源特性? ...
Hive sql 经典题目和 复杂hsq
【计算机网络】基础知识点
MySQL中WHERE后跟着N多个OR条件会怎样. ...
标签云
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
IOS
物联网
SQL-Server
快速回复
返回顶部
返回列表