UTF-8解码

本文详细介绍了UTF-8编码的解码过程,包括如何识别leading byte和continuation bytes,以及使用boost::locale库进行解码的方法。通过分析boost库的源码,探讨了非ASCII字符的处理方式,特别是switch/case语句的特殊用法,并解释了为何采用特定的位运算来组合字节。
摘要由CSDN通过智能技术生成

要想了解UTF-8编码规则,请参考我的文章:http://blog.csdn.net/sheismylife/article/details/8570015

在我的另一篇文章"UTF-8编码实测" http://blog.csdn.net/sheismylife/article/details/8571726 中,我使用了boost::locale库的代码来解码UTF-8. 现在来仔细研究一下解码的算法:


如何分辨leading byte和continuation bytes呢?关键在于任何一个continuation byte都以10开始。下面的函数可以帮助判断是否为continuation byte:

bool is_trail(char ci) {
  unsigned char c = ci;
  return (c & 0xC0) == 0x80;
}
因为0xC0二进制格式是1100 0000,和c按位与后也就是低六位全部设置为0,进保留c的高两位.

而0x80二进制格式是1000 0000, 如果两者相等,说明c的高两位是10,因此c是continuation byte。返回true。

有了这个函数,判断一个字节是否为leading byte也很简单:

bool is_lead(char ci) {
  return !is_trail(ci);
}


再看一下函数trail_length, 该函数通过分析一个leading byte来确定continuation bytes的长度

int trail_length(char ci) {
  unsigned char c = ci;
  if(c < 128)
    return 0;
  if(BOOST_LOCALE_UNLIKELY(c < 194))
    return -1;
  if(c < 224)
    return 1;
  if(c < 240)
    return 2;
  if(BOOST_LOCALE_LIKELY(c <=244))
    return 3;
  return -1;
}

如果c < 128, 说明就是一个ASC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值