小问题·统计含中文字符串的有效字符个数

需求:

  • 实现一个备注功能,备注限制内容在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 时,那么本字节肯定时中文编码,所以需要跳三个字节

猜你喜欢

转载自blog.csdn.net/m0_64560763/article/details/132489590