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

需求:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值