C 有人知道下面的代码可能做什么吗?
我打赌这和编码有关 但是它到底是如何工作的呢 更新C 有人知道下面的代码可能做什么吗?,c,encoding,utf-8,C,Encoding,Utf 8,我打赌这和编码有关 但是它到底是如何工作的呢 更新 /* utf-8: 0xc0, 0xe0, 0xf0, 0xf8, 0xfc */ static unsigned char _mblen_table_utf8[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
/* utf-8: 0xc0, 0xe0, 0xf0, 0xf8, 0xfc */
static unsigned char _mblen_table_utf8[] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1
};
while(strtree,cr,sizeof(结构规则项),str,j);
str+=j;
}
}
由于多字节字符串中的字符具有可变长度,因此此表将每个字符映射到一个长度
最后64个字符比一个字节宽,长度为2
到6
用法如下:
while (str < ptr)
{
j = mblen[(*str)];
tree_nput(r->tree, cr, sizeof(struct rule_item), str, j);
str += j;
}
}
unsigned char current\u char=*mbstr;
对于(i=0;i<_mblen_table_utf8[当前字符];i++){
/*将*mbstr++视为当前字符的一部分*/
}
由于多字节字符串中的字符具有可变长度,因此此表将每个字符映射到一个长度
最后64个字符比一个字节宽,长度为2
到6
用法如下:
while (str < ptr)
{
j = mblen[(*str)];
tree_nput(r->tree, cr, sizeof(struct rule_item), str, j);
str += j;
}
}
unsigned char current\u char=*mbstr;
对于(i=0;i<_mblen_table_utf8[当前字符];i++){
/*将*mbstr++视为当前字符的一部分*/
}
没有任何进一步的细节,上面的代码就是这样做的:它声明一个静态无符号字符数组,并用花括号内的值初始化它。没有任何进一步的细节,上面的代码正是这样做的:它声明一个静态无符号字符数组,并用花括号内的值对其进行初始化。历史上,每个字符都是以7位(然后是8位)编码的,这足以对欧洲语言的字母表进行编码
只有前128个字符是每个人共有的,其余128个是通过代码页标准化的(例如)
由于需要对较长的字母表语言(如汉语)进行编码,因此每个字符都是按几个字节编码的
是一种以高效、可变代码长度的方式对Unicode字符进行编码的方法。这意味着您读取的第一个字节决定了字符字节序列的长度
基本上,您的表是一个查找表,用于检查从用作表索引的字节开始的字符有多少字节。您将看到此表的另一个版本及其说明
我添加了表索引作为注释,以使其更清晰:
unsigned char current_char = *mbstr;
for (i = 0; i < _mblen_table_utf8[current_char]; i++) {
/* treat *mbstr++ as a part of the current character */
}
历史上,每个字符都是以7位(然后是8位)编码的,这足以编码欧洲语言的字母表 只有前128个字符是每个人共有的,其余128个是通过代码页标准化的(例如) 由于需要对较长的字母表语言(如汉语)进行编码,因此每个字符都是按几个字节编码的 是一种以高效、可变代码长度的方式对Unicode字符进行编码的方法。这意味着您读取的第一个字节决定了字符字节序列的长度 基本上,您的表是一个查找表,用于检查从用作表索引的字节开始的字符有多少字节。您将看到此表的另一个版本及其说明 我添加了表索引作为注释,以使其更清晰:
unsigned char current_char = *mbstr;
for (i = 0; i < _mblen_table_utf8[current_char]; i++) {
/* treat *mbstr++ as a part of the current character */
}
该数组似乎是一个查找表,用于确定给定第一个字节的UTF-8字符中的字节数。基本上,第一个字节(作为无符号值)用作数组的索引,该索引处的元素给出UTF-8字符的字节序列长度 无效字节和中间序列字节似乎映射到此表中的1字节,因此,如果遇到不合适的情况,则使用此表的代码可能会将它们视为单个字符(除非它特别忽略它们)
这种表的一个用途是计算UTF-8字符串中的字符(不是字节,而是Unicode字符)。每次计算字符数时,都会查找长度并按字符字节序列的长度向前移动,而不是向前移动一个字节。。。只要从字符的开头开始,并且字符串始终是有效的UTF-8,它就可以正常工作。该数组似乎是一个查找表,用于确定给定第一个字节的UTF-8字符中的字节数。基本上,第一个字节(作为无符号值)用作数组的索引,该索引处的元素给出UTF-8字符的字节序列长度 无效字节和中间序列字节似乎映射到此表中的1字节,因此,如果遇到不合适的情况,则使用此表的代码可能会将它们视为单个字符(除非它特别忽略它们)
这种表的一个用途是计算UTF-8字符串中的字符(不是字节,而是Unicode字符)。每次计算字符数时,都会查找长度并按字符字节序列的长度向前移动,而不是向前移动一个字节。。。只要从字符的开头开始,并且字符串始终是有效的UTF-8,它就可以正常工作。I什么上下文?这只是一个数组的声明。它实际上没什么用处。你还应该找到并发布使用_mblen_table_utf8的代码。这是一个相当粗糙且不正确的UTF-8多字节字符长度表,但只要输入数据格式正确,它就应该工作。(至于错在哪里,表中C0和C1字节被错误地编码为2字节字符起始字节。5字节和6字节的字节也错了。UTF-8最多是4字节对应一个字符。)@R,似乎C0和C1字节实际上是2字节字符起始字节,根据,你认为有什么不对?请给我看一个以C0或C1开头的字符。不存在。我需要什么背景?这只是一个数组的声明。它实际上没有什么作用。你还应该找到并发布使用_mblen_table_utf8的代码。这是一个相当粗糙和不正确的U表