1. 函数IDirectFBFont_GetStringBreak存在Bug
(1) 所在文件:src/media/idirectfbfont.c
(2) 函数原型:
IDirectFBFont_GetStringBreak( IDirectFBFont *thiz,
const char *text,
int bytes,
int max_width,
int *ret_width,
int *ret_str_length,
const char **ret_next_line)
(3) Bug描述:通过该函数获取到字符串(text)的字节数(ret_str_length)有误,具体表现为,当字符串为英文时没问题,为中文时有问题。
do {
*ret_width = width;
length ++; //每循环一次字节数加一
current = DIRECT_UTF8_GET_CHAR( string );
string += DIRECT_UTF8_SKIP( string[0] ); //一个字符一个字符地扫描
//注意:一个字符的字节数是不定的,这取决于字符集及编码方式,这里使
//用的是UTF-8,而英文的UTF-8编码为1个字节,而中文则不定,有2字
//节的,也有三字节的,而且通常为三字节。
//于是,当字符串为中文时Bug就出现了:一次循环扫描了一个中文字符,
//但记录字节数的变量length只增加了1
………..
}
(4) Bug的解决:含有Bug的代码可改为:
do {
*ret_width = width;
current = DIRECT_UTF8_GET_CHAR( string );
int temp_skip = DIRECT_UTF8_SKIP( string[0] );
string += temp_skip;
length += temp_skip; //每次循环增加的字节数为跳过的字符的字节数
………….
}