int str_is_utf8(const char *string, size_t *out_len) { int offset = 0; int is_truncated = 0;

if(!string)
	return 0;

const unsigned char * bytes = (const unsigned char *)string;
while(*bytes)
{
	if( (// ASCII
		// use bytes[0] <= 0x7F to allow ASCII control characters
		bytes[0] == 0x09 ||
		bytes[0] == 0x0A ||
		bytes[0] == 0x0D ||
		(0x20 <= bytes[0] && bytes[0] <= 0x7E)
		)
	) {
		bytes += 1;
		offset += 1;
		continue;
	}

	if( (// non-overlong 2-byte
		(0xC2 <= bytes[0] && bytes[0] <= 0xDF) &&
		(0x80 <= bytes[1] && bytes[1] <= 0xBF)
		)
	) {
		bytes += 2;
		offset += 2;
		is_truncated = 1;
		continue;
	}

	if( (// excluding overlongs
		bytes[0] == 0xE0 &&
		(0xA0 <= bytes[1] && bytes[1] <= 0xBF) &&
		(0x80 <= bytes[2] && bytes[2] <= 0xBF)
		) ||
		(// straight 3-byte
		((0xE1 <= bytes[0] && bytes[0] <= 0xEC) ||
		bytes[0] == 0xEE ||
		bytes[0] == 0xEF) &&
		(0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
		(0x80 <= bytes[2] && bytes[2] <= 0xBF)
		) ||
		(// excluding surrogates
		bytes[0] == 0xED &&
		(0x80 <= bytes[1] && bytes[1] <= 0x9F) &&
		(0x80 <= bytes[2] && bytes[2] <= 0xBF)
		)
	) {
		bytes += 3;
		offset += 3;
		is_truncated = 1;
		continue;
	}

	if( (// planes 1-3
		bytes[0] == 0xF0 &&
		(0x90 <= bytes[1] && bytes[1] <= 0xBF) &&
		(0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
		(0x80 <= bytes[3] && bytes[3] <= 0xBF)
		) ||
		(// planes 4-15
		(0xF1 <= bytes[0] && bytes[0] <= 0xF3) &&
		(0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
		(0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
		(0x80 <= bytes[3] && bytes[3] <= 0xBF)
		) ||
		(// plane 16
		bytes[0] == 0xF4 &&
		(0x80 <= bytes[1] && bytes[1] <= 0x8F) &&
		(0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
		(0x80 <= bytes[3] && bytes[3] <= 0xBF)
		)
	) {
		bytes += 4;
		offset += 4;
		is_truncated = 1;
		continue;
	}

	is_truncated = check_utf8_trunc_left(string + offset, strlen(string) - offset);
	if (is_truncated)
		*out_len = offset;
	else
		*out_len = 0;
	return 0;
}

return 1;

}

该函数通过逐个字节检查字符串,根据 UTF-8 编码规则判断字符是否合法,并将字符串有效长度存储在 out_len 参数中。如果字符串为合法的 UTF-8 编码且没有被截断,则函数返回 1,否则返回 0。

C 函数 str_is_utf8:检测字符串是否为 UTF-8 编码

原文地址: https://www.cveoy.top/t/topic/mKCY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录