//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;
}