UTF-8 字符编码长度计算

//utf8字符长度1-6,可以根据每个字符第一个字节判断整个字符长度:
//0xxxxxxx {0x00 ~ 0x7F ASCII 占1个字节}
//110xxxxx 10xxxxxx {0xC0 ~ 0xDF UTF-8 占2个字节}
//1110xxxx 10xxxxxx 10xxxxxx {0xE0 ~ 0xEF UTF-8 占3个字节}
//11110xxx 10xxxxxx 10xxxxxx 10xxxxxx {0xF0 ~ 0xF7 UTF-8 占4个字节}
//111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx {0xF8 ~ 0xFB UTF-8 占5个字节}
//1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx {0xFC ~ 0xFD UTF-8 占6个字节}

//如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
//如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
//如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字

if (byte <= 0x7F) then ASCII 占用1个字节

if (byte >= 0xC0 && byte <= 0xDF) then 首字节   UTF-8 占用2个字节

if (byte >= 0xE0 && byte <= 0xEF) then 首字节   UTF-8 占用3个字节

if (byte >= 0xF0 && byte <= 0xF7) then 首字节   UTF-8 占用4个字节

if (byte >= 0xF8 && byte <= 0xFB) then 首字节   UTF-8 占用5个字节

if (byte >= 0xFC && byte <= 0xFD) then 首字节   UTF-8 占用6个字节

if (byte > 0x7F && byte < 0xC0 ) then UTF-8非首字节

/*
 * @breif 	获取UTF-8 字符长度
 * @param	byte:1个字节数据
 * @return 	0:UTF-8 非首字节,大于0:UTF-8 字符字节数
*/
uint8_t utf8_code_bytes(uint8_t byte)
{
    int bytes = 0;

    if (byte <= 0x7F) { //then ASCII 占用1个字节
        bytes = 1;
    } else if (byte >= 0xC0 && byte <= 0xDF) {  // then 首字节   UTF-8 占用2个字节
        bytes = 2;
    } else if (byte >= 0xE0 && byte <= 0xEF) {  // then 首字节   UTF-8 占用3个字节
        bytes = 3;
    } else if (byte >= 0xF0 && byte <= 0xF7) {  // then 首字节   UTF-8 占用4个字节
        bytes = 4;
    } else if (byte >= 0xF8 && byte <= 0xFB) {  // then 首字节   UTF-8 占用5个字节
        bytes = 5;
    } else if (byte >= 0xFC && byte <= 0xFD) {  // then 首字节   UTF-8 占用6个字节
        bytes = 6;
    } else if (byte > 0x7F && byte < 0xC0 ) {   // then UTF-8   非首字节
        bytes = 0;
    }

    return bytes;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongYuLong的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值