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

简介: 带你读《全景揭秘字符编码》之十:常见字符编码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

相关文章
|
机器学习/深度学习 C语言
【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)
【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)
493 0
【C语言必知必会 | 子系列第五篇】深入剖析循环结构(1)
|
12月前
|
存储 自然语言处理 Java
全球语言无障碍:Unicode标准解读与技术演进史
Unicode是全球字符统一编码标准,旨在为世界上所有文字、符号及emoji分配唯一码点,解决多语言乱码问题。它兼容ASCII,支持超14万字符,覆盖现代与古文字,通过UTF-8、UTF-16等编码方案实现跨平台信息交换,是互联网、操作系统和多语言通信的基础。
2040 2
|
JSON 搜索推荐 算法
利用API提升电商用户体验:个性化推荐系统
在电商竞争激烈的当下,个性化推荐系统成为提升用户粘性与转化率的关键。本文详解如何通过API集成高效接入先进推荐算法,实现实时精准推荐,优化用户体验,提升业务增长。
|
11月前
|
自然语言处理 监控 供应链
电商API大揭秘:淘宝京东拼多多助力商家破局之道
在电商红海中,数据驱动成破局关键。本文深度解析淘宝、京东、拼多多API能力,涵盖商品、订单、用户与营销模块,结合库存同步等代码实例,揭示如何通过技术实现高效运营。某品牌接入后上新仅20分钟,订单处理效率提升12倍,营销ROI翻倍。附落地路径与监控体系,助力商家实现自动化、智能化升级。(238字)
|
9月前
|
存储 人工智能 安全
AI智能体的开发费用
2026年AI智能体开发成本两极分化:低代码工具使简单Agent成本降至5千-2万元,而复杂企业级系统仍需30万以上。费用涵盖开发、API、算力及维护,建议从中级智能体切入,结合开源平台与工作流模式降本增效。#AI智能体 #降本策略
|
存储 网络协议 算法
UDP 协议和 TCP 协议
本文介绍了UDP和TCP协议的基本结构与特性。UDP协议具有简单的报文结构,包括报头和载荷,报头由源端口、目的端口、报文长度和校验和组成。UDP使用CRC校验和来检测传输错误。相比之下,TCP协议提供更可靠的传输服务,其结构复杂,包含序列号、确认序号和标志位等字段。TCP通过确认应答和超时重传来保证数据传输的可靠性,并采用三次握手建立连接,四次挥手断开连接,确保通信的稳定性和完整性。
770 1
UDP 协议和 TCP 协议
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
1201 17
|
JavaScript
vue3,使用watch监听props中的数据
【10月更文挑战第3天】
4367 2
|
传感器 边缘计算 自动驾驶
|
小程序
【支付宝商家助手】正式上线——随时随地移动管理 助力经营
【支付宝商家助手】正式上线——随时随地移动管理 助力经营
1728 11