UTF-8编解码之说明_utf编解码-程序员宅基地

技术标签: 扩展  算法  character  语言  transformation  pair  

我们知道ASCII码表中总共只有值在0-127之间的128个字符,用其表示纯粹的英文字符等已经足够了,而正是基于此产生了ANSI字符集。ANSI字符集中每个字符都是以一个8位的字节表示,但是后来随着全球信息化的加强,各国的语言都需要得到相应的体现,于是就出现了宽字符集,再后来就出现了unicode字符集,unicode又有UCS-2 和 UCS-4两种标准,不过通常unicode字符集中每个字符用两个字节来表示,这种表示方法就能囊括目前各国的语言字符,并且能有扩展的空间。而UTF8更是对传统的unicode等长字符表示方式的一种改进,它采用的较为灵活的变长方式,这样能够在概率上做到空间上的节省。下面是UTF8的原理说明。

UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。值得强调的是,UTF-8只是Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

当要表示的内容是 7位 的时候就用一个字节:0******* 第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。

当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10****** 第一个字节的110和第二个字节的10为标志位。

当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10****** 和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的所有*的位置都应该根据实际数据加以填充有效数据。

以此类推:
四个字节:11110**** 10****** 10****** 10******
五个字节:111110*** 10****** 10****** 10****** 10******
六个字节:1111110** 10****** 10****** 10****** 10****** 10******

下面的参考文章出自http://blog.csdn.net/xiongchen/archive/2006/04/10/657068.aspx,我觉得总结的很好,尤其是这里有关于Surrogate Pair 的说明特粘贴至此:

一、        Unicode发展历史
字符必须经过编码以后才能被计算机处理,计算机使用的默认编码方式称为计算机的内码。早期的计算机使用7位的ASCII编码作为内码,但ASCII编码只能处理2^7=128个字符(包括英文字母、数字、符号、控制字符等),但是世界上有着成百上千种的语言,仅仅用ASCII是无法进行处理的。因此,世界各国开始纷纷研究处理本国语言的方法。在中国为了处理汉字,程序员设计了用于简体中文的GB2312编码和用于繁体中文的big5编码。
 
中国各种编码标准的情况:
1980年公布的GB2312编码标准一共收录了7445个字符,包括6763个汉字和682个其它符号。
GB2312 支持的汉字太少。1995年公布的汉字扩展规范GBK1.0则收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。
     2000年发布的GB18030正式取代GBK1.0成为国家标准,该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,所以现在的PC平台必须支持GB18030标准。
 
 
光是在中国就有那么多种不同的编码方式,世界各国编码方式的混乱情况就可想而知了。于是人们开始寻求一种统一的标准编码方法来表示和处理世界上绝大多的语言,众多的编码方法中最后只有Unicode编码最终成为了事实标准。
Unicode字符集编码是(Universal Multiple-Octet Coded Character Set) 通用多八位编码字符集的简称,支持世界上超过650种语言的国际字符集。它是由一个名为 Unicode 协会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0,Unicode协会的官方网站是http://www.unicode.org,上面有关于Unicode的最新消息与最权威的资料。
 
二、        Unicode 编码术语解释
UCS:Universal Multiple-Octet Coded Character Set(通用多八位编码字符集)的字符集,也可以以看作是"Unicode Character Set"的缩写。有UCS-2和UCS-4两种不同的实现方法,UCS-2采用两个字节进行编码,而UCS-4采用4个字节(实际上只用了31位,最高位必须为0)进行编码。
UTF编码:即UCS Transformation Format(UCS转换格式),它是将Unicode编码规则和计算机的实际编码对应起来的一个规则,用于网络传输、编码转换等。
Little Endian/Big Endian:字节序,也就是处理多字节时采用的顺序,例如:“南”字的Unicode编码是5357,字节序将决定它写到文件里时,是53在前还是57在前,如果是Big Endian则写为5357,反之则是5753。
 
三、        Unicode编码中的数学
1、  UCS-2使用2个字节,即16位来编码,所以共可以表示 216=65536 个码元; UCS-4 使用 4 个字节,即 32 位来编码,但最高位必须为 0 ,所以共可以表示 231=2147483648 个码元。
2、UCS-4码元的管理:由于UCS-4表示的码元非常大,所以需要采用一种机制来管理这些码元。UCS-4先根据最高字节不同分为27=128个群组,再根据第二个字节不同分为28=256个平面,然后根据第三个字节不同分为28=256行,最后根据第四个字节不同分为每行分为256个单元。也就是说同一行的不同单元只是最后一个字节不同,其余都相同。
3、UCS-4编码中,群号为0,平面号为0的所有码元称之为BMP,即Basic Multilingual Plane(基础多语言平面)。
4、将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。
这些数据和关系可以由下图清楚的得到:

 
 
群号: 0~127
 
 
平面号: 0~255
 
 
行号: 0~255
 
 
单元号: 0~255
 


0
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/winner82/article/details/2069717

智能推荐

IT项目管理之第6章 项目成本管理习题之案例分析汇总_it项目管理第六章课后答案-程序员宅基地

文章浏览阅读6k次,点赞8次,收藏64次。IT项目管理之第6章 项目成本管理习题之案例分析汇总第6章 项目成本管理习题之案例分析汇总【案例1】【案例1分析】【案例1参考答案】【案例2】【案例2分析】【案例2参考答案】叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!_it项目管理第六章课后答案

标准对话框和文件对话框_标准 dialog-程序员宅基地

文章浏览阅读114次。代码实例#include "modaldialog.h"#include <QMenuBar>#include <QMenu>#include <QAction>#include <QDialog>#include <QDebug>#include <QMessageBox>#include <QFile..._标准 dialog

Apache Druid 在 Shopee 的工程实践_窗口函数 apache druid-程序员宅基地

文章浏览阅读805次。本文首发于微信公众号“Shopee技术团队”。摘要Apache Druid 是一款高性能的开源时序数据库,它适用于交互式体验的低延时查询分析场景。本文将主要分享 Apache Druid 在支撑 Shopee 相关核心业务 OLAP 实时分析方面的工程实践。随着 Shopee 业务不断发展,越来越多的相关核心业务愈加依赖基于 Druid 集群的 OLAP 实时分析服务,越来越严苛的应用场景使得我们开始遇到开源项目 Apache Druid 的各种性能瓶颈。我们通过分析研读核心源码,对出现性能瓶._窗口函数 apache druid

贪心算法-背包问题(python实现)_背包问题贪心算法python-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏18次。贪心算法-背包问题⼀个⼩偷在某个商店发现有n个商品,第i个商品价值vi元,重wi千克。他希望拿⾛的价值尽量⾼,但他的背包最多只能容纳W千克的东⻄。他应该拿⾛哪些商品?0-1背包:对于⼀个商品,⼩偷要么把它完整拿⾛,要么留下。不能只拿⾛⼀部分,或把⼀个商品拿⾛多次。(商品为⾦条)分数背包:对于⼀个商品,⼩偷可以拿⾛其中任意⼀部分。(商品为⾦砂)举例:商品1:v1=60 w1=10商品2:v2=100 w2=20商品3:v3=120 w3=30背包容量:W=50 goods = [(6_背包问题贪心算法python

基于格拉姆角场GAF结合卷积神经网络的故障诊断附matlab代码 2023新算法,直接写!-程序员宅基地

文章浏览阅读720次,点赞13次,收藏8次。多输入单输出 (MISO) 预测在许多实际应用中至关重要,例如故障诊断、异常检测和预测性维护。本文提出了一种基于格拉姆角场 (GAF) 和卷积神经网络 (CNN) 的 MISO 预测方法。GAF 用于提取输入数据中的局部特征,而 CNN 用于学习这些特征之间的关系并生成预测。该方法在故障诊断任务上进行了评估,实验结果表明其具有良好的预测精度和鲁棒性。引言MISO 预测是指基于多个输入变量预测单个输出变量的任务。它在许多领域都有着广泛的应用,例如故障诊断、异常检测和预测性维护。

字符串的重复判断_文本字符串重复识别多少位-程序员宅基地

文章浏览阅读556次。刚才无意间看到一个数学题目,六位数能被9整除,且各个数字不相同,求最大的六位数减最小六位的数。看到这种题目我想都没想就直接打开了vs,中途遇到了一个问题就是不能有重复的数字,我就用itoa函数将数字转换成字符串然后再判断:bool Check_2(char* str){if (*str == 0) return false;for (char* p = str; *p != 0; p++){ for (char* q = p + 1; *q != 0; q++) { if (*p == *_文本字符串重复识别多少位

随便推点

EduCoder-Web程序设计基础-html5— 对表单元素分组-第2关:对表单元素分组_html5中对表单的相关元素进行分组设置-程序员宅基地

文章浏览阅读585次。目录任务描述相关知识编程要求测试说明代码示例任务描述本关任务:对表单进行分组。相关知识为了完成本关任务,你需要掌握fieldset与legend元素来进行表单的分组。对表单进行分组fieldset为表单的一个子容器将所包含的内容以边框环绕方式显示。legend为fieldset边框添加相关的标题示例如下: 健康档案 身高 体重 界面效果如下: 表单分组 编程要求仿照上面的示例,在右侧编辑器中的Begin - End区域内补充代码,具体要求是:_html5中对表单的相关元素进行分组设置

开启Xamarin.Forms的智能感知(代码提示功能)-程序员宅基地

文章浏览阅读261次。在使用Xamarin.Forms经常要编写xaml文件,如果是手写的话是在太蛋疼了,其实是可以开启智能感知的1.Xamarin Studio更新到最新版本,具体什么版本开始的不知道了,5.7以上的肯定可以,使用新技术就别用那种几年前的版本了,要勤更新,Xamarin.Forms并不是一个成熟的技术。2.Visual Stuio还是上面那句话,XForms对VS..._xamarin.form 游戏触摸遥感

Spark笔记7之广播变量累加器_sparkfan 7-程序员宅基地

文章浏览阅读128次。参考:共享变量通常情况下,一个传递给 Spark 操作(例如 map 或 reduce)的函数 func 是在远程的集群节点上执行的。该函数 func 在多个节点执行过程中使用的变量,是同一个变量的多个副本。这些变量的以副本的方式拷贝到每个机器上,并且各个远程机器上变量的更新并不会传播回 driver program(驱动程序)。通用且支持 read-write(读-写) 的共享变量在任务..._sparkfan 7

Linux音频设备驱动-3_static int wm8904_adc_osr_put(struct snd_kcontrol -程序员宅基地

文章浏览阅读600次。4、put()函数put()用于从用户空间写入值,如果值被改变,该函数返回1,否则返回0;如果发生错误,该函数返回1个错误码。代码清单17.22给出了1个put()函数的范例。代码清单17.22 snd_ctl_elem_info结构体中put()函数范例1 static int snd_xxxctl_put(struct snd_kcontrol *kcontrol, struct_static int wm8904_adc_osr_put(struct snd_kcontrol *kcontrol, struct snd_ctl_

IPtables中SNAT、DNAT和MASQUERADE的含义_通信中的masque是什么-程序员宅基地

文章浏览阅读475次。IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。SNAT是source networkaddress translation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接_通信中的masque是什么

Python-Django毕业设计基于的开放式实验室预约系统(程序+Lw)_基于python的实验室预约管理系统-程序员宅基地

文章浏览阅读184次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程项目运行环境配置:Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs。项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。_基于python的实验室预约管理系统

推荐文章

热门文章

相关标签