本帖最后由 7ian 于 2024-7-18 12:03 编辑
看了下论坛的所有判断uft8的代码:搜索 精易论坛 (125.la)
基本都是把普通的单字节数字跟字母符号都没算进去,正常这些转成utf8也是单字符
还有就是一些特殊文字直接到字节集后也被当做uft8,也是考虑不全面
我不但把纯数字字母符号加进去,还有空格以及
低于0x20(空格)的字节,只保留判断09(tab) 0a 0d (这两个大家不陌生吧) 都当作是uft8
按正常来说,低于0x20的都算,但是我们一般是为了直接展示文本,除了上面3个可以直观看到,
其它的看到的都是□□□□□□ 所以去掉判断了
另外就是有的人喜欢在uft8最后加个{0},如果这种检测出来,返回值肯定是返回 长度-1 的,自己人工判断下
当,返回值=长度-1 且 最后一个字节是0时,可以当作是uft8
utf84种类型,置判断1/3/4,因为2会跟普通的ansi中文冲突,所以去掉了,但是所有的中文转成utf8会是3类型,这点不冲突,我们用来判断中文足够了
1类型就是那些半角符号数字字母等
4类型还没遇到,就加上去吧
喜欢的点个赞,
源码不用下载,直接复制:
|
字节集_是否utf82 | 逻辑型 | | |
数据 | 字节集 | | | | 最后是否为0 | 逻辑型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 数据地址 | 整数型 | | | 数据长度 | 整数型 | | | 返回长度 | 整数型 | | |
数据地址 = 0 数据长度 = 0 置入代码 ({ 139, 69, 8, 139, 0, 131, 192, 4, 139, 8, 137, 77, 248, 131, 192, 4, 137, 69, 252 })返回长度 = 字节集_是否utf8 (数据地址, 数据长度 )如果真 (最后是否为0 且 返回长度 = 数据长度 - 1 且 数据 [数据长度 ] = 0 )返回 (真)返回 (数据长度 = 返回长度)|
字节集_是否utf8 | 整数型 | | |
数据指针 | 整数型 | | | | 长度 | 整数型 | | | | 置入代码 ({ 198, 69, 251, 0, 198, 69, 239, 0, 199, 69, 224, 0, 0, 0, 0, 235, 9, 139, 69, 224, 131, 192, 1, 137, 69, 224, 139, 69, 224, 59, 69, 12, 15, 141, 162, 1, 0, 0, 139, 69, 8, 3, 69, 224, 138, 8, 136, 77, 215, 15, 190, 69, 251, 133, 192, 15, 133, 143, 0, 0, 0, 15, 182, 69, 215, 61, 245, 0, 0, 0, 124, 12, 233, 139, 1, 0, 0, 233, 134, 1, 0, 0, 235, 115, 15, 182, 69, 215, 61, 240, 0, 0, 0, 124, 12, 198, 69, 251, 3, 138, 69, 215, 136, 69, 239, 235, 92, 15, 182, 69, 215, 61, 224, 0, 0, 0, 124, 12, 198, 69, 251, 2, 138, 69, 215, 136, 69, 239, 235, 69, 15, 182, 69, 215, 131, 248, 127, 124, 12, 233, 72, 1, 0, 0, 233, 67, 1, 0, 0, 235, 48, 15, 182, 69, 215, 131, 248, 32, 125, 27, 15, 182, 69, 215, 131, 248, 13, 116, 18, 15, 182, 69, 215, 131, 248, 10, 116, 9, 15, 182, 69, 215, 131, 248, 9, 117, 2, 235, 10, 233, 22, 1, 0, 0, 233, 17, 1, 0, 0, 233, 247, 0, 0, 0, 15, 190, 69, 251, 131, 248, 2, 15, 140, 208, 0, 0, 0, 15, 190, 69, 239, 133, 192, 15, 132, 196, 0, 0, 0, 15, 190, 69, 239, 61, 224, 0, 0, 0, 117, 37, 15, 182, 69, 215, 193, 248, 5, 131, 248, 5, 117, 10, 138, 69, 251, 44, 1, 136, 69, 251, 235, 10, 233, 205, 0, 0, 0, 233, 200, 0, 0, 0, 233, 142, 0, 0, 0, 15, 190, 69, 239, 61, 237, 0, 0, 0, 117, 34, 15, 182, 69, 215, 193, 248, 5, 131, 248, 4, 117, 10, 138, 69, 251, 44, 1, 136, 69, 251, 235, 10, 233, 157, 0, 0, 0, 233, 152, 0, 0, 0, 235, 97, 15, 190, 69, 239, 61, 240, 0, 0, 0, 117, 43, 138, 69, 215, 192, 232, 4, 136, 69, 215, 15, 182, 69, 215, 131, 248, 9, 116, 9, 15, 182, 69, 215, 131, 248, 11, 117, 10, 138, 69, 251, 44, 1, 136, 69, 251, 235, 4, 235, 100, 235, 98, 235, 43, 15, 190, 69, 239, 61, 244, 0, 0, 0, 117, 28, 15, 182, 69, 215, 193, 248, 4, 131, 248, 8, 117, 10, 138, 69, 251, 44, 1, 136, 69, 251, 235, 4, 235, 61, 235, 59, 235, 4, 235, 8, 235, 6, 198, 69, 239, 0, 235, 26, 15, 182, 69, 215, 193, 248, 6, 131, 248, 2, 117, 10, 138, 69, 251, 44, 1, 136, 69, 251, 235, 4, 235, 23, 235, 21, 233, 73, 254, 255, 255, 15, 190, 69, 251, 133, 192, 126, 8, 15, 190, 69, 251, 247, 216, 235, 3, 139, 69, 224, 201, 194, 8, 0 })返回 (0 )
[C++] 纯文本查看 复制代码 int32_t isValidUTF8(uint8_t* data, int32_t len) {
int8_t octets = 0;
int32_t i = 0;
for (i = 0; i < len; i++)
{
uint8_t c = data;
if (octets == 0) {
if (c > 0xF4) goto endLoop;
if (c >= 0xF0) octets = 3;
else if (c >= 0xE0) octets = 2;
else if (c >= 0xC2) octets = 1;
else if (c > 0x7F) goto endLoop;
else if (c >= 0x20 || c==0x0D || c==0x0A || c==0x09);
else goto endLoop;
}
else {
if ((c >= 0x80) && (c <= 0xBF)) --octets;
else goto endLoop;
}
}
if (octets != 0)return -octets;
endLoop:
return i;
}
|