带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(9)

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(9)

带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(8) https://developer.aliyun.com/article/1240879?groupCode=tech_library


10.5.2程序算法


用文字不太好描述算法结构,我们就直接来欣赏一下UTF-8鼻祖写的这段解析代码,这是Ken Thompson(B语言、C语言的作者、Unix之父)和 Rob Pike 用一个晚上写出来的编解码算法,代码非常简短精炼,为了方便阅读我加了注释解读。


typedefstruct

{

 intcmask; //前缀码掩码

 intcval;  //前缀码

 intshift; //移动位数

 longlmask; //Unicode值掩码

 longlval;  //Unicode下限值

} Tab;

 

staticTab  tab[] =

{

 0x80, 0x00, 0*6, 0x7F,       0,         /* 1 byte sequence */

 0xE0, 0xC0, 1*6, 0x7FF,      0x80,      /* 2 byte sequence */

 0xF0, 0xE0, 2*6, 0xFFFF,     0x800,     /* 3 byte sequence */

 0xF8, 0xF0, 3*6, 0x1FFFFF,   0x10000,   /* 4 byte sequence */

 0xFC, 0xF8, 4*6, 0x3FFFFFF,  0x200000,  /* 5 byte sequence */

 0xFE, 0xFC, 5*6, 0x7FFFFFFF, 0x4000000, /* 6 byte sequence */

 0, /* end of table */

};

 

/**

* 把一个多字节序列转换为一个宽字符

*

* @param p 存放计算后的unicode值

* @param s 需要解析的UTF-8字节序列

* @param n 字节长度

* @return 解析的字节长度

*/

intmbtowc(wchar_t*p, char*s, size_tn)

{

 longl;  intc0, c, nc;  Tab *t;

 if(s == 0) return0;

 nc = 0;

 //异常校验(可不用关注)

 if(n <= nc) return-1;

 //c0 此处备份一下首字节,后续需要用到前缀码

 c0 = *s & 0xff;

 //l 保存 Unicode 结果

 l = c0;

 /* 遍历tab,从单字节结构->2字节结构->..依次检查找到对应tab */

 for(t=tab; t->cmask; t++) {

   //字节数+1,字节数和tab结构是对应的,也就是当nc=1时 tab结构是单字节,nc=2是tab是两字节

   nc++;

   /* 判断前缀码跟当前的tab是否一致, 如果一致计算最终unicode值并返回*/

   if((c0 & t->cmask) == t->cval) {

     //通过 & Unicode有效值掩码,移除高位前缀码,得到最终unicode值

     l &= t->lmask;

     //异常校验

     if(l < t->lval) return-1;

     //保存结果并反回

     *p = l;

     returnnc;

   }

   //异常校验

   if(n <= nc) return-1;

   //读取下个字节;如果上面判断前缀码不一致,说明需要再读取下个字节

   s++;

   //计算有效位的值,目的是去除UTF-8 编码从第二个字节开始的高两位10

   // 例如 s=10101111、0x80=10000000 计算结果是00101111,这样就去除了高位前缀10

   c = (*s ^ 0x80) & 0xFF;

   //异常校验

   if(c & 0xC0) return-1;

   //重新计算unicode值,根据UTF-8规则c只有低 6 位有效,所以通过移位把c填入到l的低6位

   l = (l<<6) | c;

 }

 //返回异常

 return-1;

}



带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(10) https://developer.aliyun.com/article/1240875?groupCode=tech_library

相关文章
|
搜索推荐 机器学习/深度学习 算法
如何增加用户的参与感?交互式推荐来了!
一方面,互动能让用户感受到更多的参与感,并能一定程度上干预推荐结果,而不只是被动接受推荐结果;另一方面,系统通过与用户的互动能更加了解用户的偏好,从而提升推荐效果。那么,我们是如何让用户和推荐系统互动起来的呢?且看下文。
5797 0
|
4月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器价格2026年3月最新:一年、1个月和1小时收费标准,不花冤枉钱~
2026年阿里云服务器最新报价:轻量应用服务器低至38元/年,ECS普惠套餐99元/年起,GPU实例按量或包年可选。涵盖包年包月、按量付费三大计费模式,详解续费同价、多年付3.9折、升级差额补价等核心规则,助您精准控本、避坑省钱。(239字)
717 1
|
9月前
|
存储 自然语言处理 Java
全球语言无障碍:Unicode标准解读与技术演进史
Unicode是全球字符统一编码标准,旨在为世界上所有文字、符号及emoji分配唯一码点,解决多语言乱码问题。它兼容ASCII,支持超14万字符,覆盖现代与古文字,通过UTF-8、UTF-16等编码方案实现跨平台信息交换,是互联网、操作系统和多语言通信的基础。
1703 2
|
12月前
|
机器学习/深度学习 弹性计算 前端开发
阿里云服务器热门实例选择解析:e/u1/c7/c8i/c9i/c8y实例适用场景价格对比参考
通过阿里云的活动购买云服务器时,除了轻量应用服务器和经济型e及通用算力型u1实例之外,对于想要购买2核4G、4核8G、8核16G等配置的用户来说,还可以选择活动内的计算型c7/c8i/c9i/c8y等热门实例规格。c7属于第七代云服务器实例,c8i和c8y均属于第八代云服务器实例实例,而计算型c9i则属于最新第九代云服务器实例,本文主要为大家详细介绍了阿里云服务器的实例规格是什么,有什么用,并汇总了阿里云轻量应用服务器和e/u1/c7/c8i/c9i/c8实例规格的适用场景,以供大家了解和选择适合自己的需求的实例规格。
|
供应链 搜索推荐 API
一文读懂:京东、淘宝、拼多多 API 接口,功能大不同,场景各有招
本文深入解析京东、淘宝、拼多多三大电商巨头的API接口特点与差异。京东API以商品管理、订单处理和物流跟踪见长,适合电商平台及零售商;淘宝API功能丰富,涵盖商品查询、订单管理与用户认证,适用多场景电商业务;拼多多API聚焦社交电商,提供拼团、砍价等特色玩法,助力商家提升曝光与销量。开发者和商家需根据自身需求选择合适的API接口,并关注其安全性与稳定性。随着技术进步,这些API将持续优化,推动电商行业蓬勃发展。
1290 4
|
JavaScript
vue3,使用watch监听props中的数据
【10月更文挑战第3天】
4282 2
|
小程序
【支付宝商家助手】正式上线——随时随地移动管理 助力经营
【支付宝商家助手】正式上线——随时随地移动管理 助力经营
1462 11
|
SQL 芯片
数字式秒表电路设计
数字式秒表电路设计
616 1
数字式秒表电路设计
|
Web App开发 人工智能 编解码
声网:如何自研支撑百万用户的毫秒级实时音视频系统?
大规模实时音视频(RTC)是疫情时代火热的在线课堂、直播、电话会议等的技术基础,但对于多数工程师来说,自研 RTC 系统的架构设计在客户端、服务端、运维、测试和质量监控上仍存在很多难点。因此我们整理了 QCon 全球软件开发大会(2021)北京站上,声网 Agora 行业架构师董海冰分享的三部分内容:RTC(实时音视频)的基础概念、场景及特点分析;自研 RTC 的架构设计和难点;展望 RTC 未来,帮你扣开实时音视频系统架构设计的大门。以下为老师分享的正文。(下文以董海冰老师第一人称叙述)
1778 0
声网:如何自研支撑百万用户的毫秒级实时音视频系统?