要想了解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