C语言判断utf-8编码字符串最后是不是中文被截断的如果是取到前一个中文
字符的方法如下:
- 找到最后一个字节,如果它的值在0x80到0xBF之间,则说明它是一个中间字节,需要继续往前找到它的起始字节。
- 如果最后一个字节的值在0xC0到0xDF之间,则说明它是一个2字节的UTF-8编码,需要取前一个字节作为起始字节。
- 如果最后一个字节的值在0xE0到0xEF之间,则说明它是一个3字节的UTF-8编码,需要取前两个字节作为起始字节。
- 如果最后一个字节的值在0xF0到0xF7之间,则说明它是一个4字节的UTF-8编码,需要取前三个字节作为起始字节。
- 如果最后一个字节的值在0x00到0x7F之间,则说明它是一个ASCII码字符,不需要进行任何处理。
以下是示例代码:
#include <stdio.h>
int is_utf8_truncated(char *str) {
int len = 0;
while (*str != '\0') {
if ((*str & 0xC0) != 0x80) { // 判断是否为UTF-8编码的起始字节
len = 0;
}
len++;
str++;
}
return len > 0 && len % 3 != 0; // 判断最后一个字符是否被截断
}
int get_last_chinese_char(char *str) {
int len = 0;
while (*str != '\0') {
if ((*str & 0xC0) != 0x80) { // 判断是否为UTF-8编码的起始字节
len = 0;
}
len++;
if (len % 3 == 0) { // 判断是否为3字节的UTF-8编码
return *(str - 2) << 16 | *(str - 1) << 8 | *str; // 将3个字节合并为一个Unicode码
}
str++;
}
return 0;
}
int main() {
char str1[] = "Hello, world!"; // ASCII码字符串
char str2[] = "中文测试"; // 完整的UTF-8编码字符串
char str3[] = "中文测"; // 被截断的UTF-8编码字符串
if (is_utf8_truncated(str1)) {
printf("str1 is truncated\n");
} else {
printf("str1 is not truncated\n");
}
if (is_utf8_truncated(str2)) {
printf("str2 is truncated\n");
} else {
printf("str2 is not truncated\n");
}
if (is_utf8_truncated(str3)) {
printf("str3 is truncated\n");
printf("last chinese character is %X\n", get_last_chinese_char(str3));
} else {
printf("str3 is not truncated\n");
}
return 0;
}
输出结果为:
str1 is not truncated
str2 is not truncated
str3 is truncated
last chinese character is 6CCE
原文地址: https://www.cveoy.top/t/topic/biuw 著作权归作者所有。请勿转载和采集!