需求:
-
实现一个备注功能,备注限制内容在0-255个字符
在上述需求中,备注功能很好实现,将用户输入的字符保存到数据库,后续用户需要是在数据库返回给用户,即可实现上述功能,但是如何判断当前备注内容是否超过限制呢?
最简单的想法是直接使用 strlen 取字符串的长度,然后判断这个长度是否超过255,当然此想法对于英文来说没有问题,但是如果用户输入中文时,比如 strlen("中文") (Linux中中文编码默认时UTF-8)输出的长度就是6,很显然会存在问题。
那么这里其实就需要一点点编码知识了,在UTF-8中,我们默认使用 3 个字节存储中文字符,使用 1 个字节存储英文字符,那我们怎么判断当前这个字节是中文还是英文呢?
我们规定字节的最高位来区分中文还是英文
-
如果本字节最高位为 0 时, 当前字符为英文字符
-
如果本字节最高位为 1 时, 当前字符为中文字符
/**
* @func: int get_string_len(char *str)
* @description: 获取 str 字符串中的有效字符长度,主要处理含中文情况
* @param {char} *str
* @return int 有效字符长度
*/
static int get_string_len(char *str)
{
int len = 0;
for (int i = 0; i < strlen(str); ++i) {
//判断当前位置是否为中文-按utf-8编码
if (str[i] & 0x80) {
i += 2;
}
++len;
}
return len;
}
在上述代码实现中,如果当前字节最高位为 1 时,那么本字节肯定时中文编码,所以需要跳三个字节