我在C中有一个函数,它将unicode代码点作为宽字符,并返回一个指向宽字符的UTF8格式的无符号字符数组的指针。然后我有另一个函数,它接受一个宽字符和一个指向数组的指针,并将宽字符的UTF8等价物插入到数组中(使用前一个函数将宽字符转换为多字节字符)。 我的问题是,由于后一个函数不知道返回的UTF8数组的长度(多字节字符),让前一个函数返回数组的长度更有意义,并将一个数组赋给一个预先声明的unsigned char指针作为参数传递?
char_u *wchar_to_mbchar(wchar_t *wChar)
{
/* WARNING - NO NULL DELIM */
char_u* mbChar;
if(*wChar < 128) /* 1 byte chars */
{
mbChar = malloc(sizeof(char_u);
*mbChar = *wChar; /* Is this okay?? */
}
else if(*wChar < 2048) /* 2 byte chars */
{
mbChar = malloc(2*sizeof(char_u));
mbChar[0] = 192 + (*wChar >> 6);
mbChar[1] = 128 + (*wChar - ((*wChar >> 6) << 6));
}
else if(*wChar < 65536) /* 3 byte chars */
{
mbChar = malloc(3*sizeof(char_u));
mbChar[0] = 224 + (*wChar >> 12);
mbChar[1] = 128 + ((*wChar - ((*wChar >> 12) << 12)) >> 6);
mbChar[2] = 128 + (*wChar - ((*wChar >> 6) << 6));
}
else if(*wChar < 2097152) /* 4 byte chars */
{
mbChar = malloc(4*sizeof(char_u));
mbChar[0] = 240 + (*wChar >> 18);
mbChar[1] = 128 + ((*wChar - ((*wChar >> 18) << 18)) >> 12);
mbChar[2] = 128 + ((*wChar - ((*wChar >> 12) << 12)) >> 6);
mbChar[3] = 128 + (*wChar - ((*wChar >> 6) << 6));
}
return mbChar;
}
/* array, input wchar, char at */
int insert_mb_char(char_u* array,wchar_t* input,int insertAt)
{
char_u *mbChar;
mbChar = wchar_to_mbchar(input);
int i;
for(i = 0; i < /*don't know how much to copy*/; i++)
array[insertAt + i] = mbChar[i];
return 0;
}
或者最好在第一个函数返回的数组末尾插入空分隔符,并简单地遍历它们? 我想这对代码性能几乎没有影响,但我只是想我会问。
另外,我知道我不应该,但是快速提问 - 最好是取消引用指针并为其指向的位置赋值,或者将新值的地址赋给指针(假设是新的)价值已经存在)?
答案 0 :(得分:1)
由于你列出的原因,以及你没有列出的其他原因:让函数返回数组的长度更有意义,并将数组赋值给作为参数传递的预先声明的unsigned char指针。
这里的主要原因是,与malloc
的单次调用相比,复制1-4个字节要快得多,并且不易出错。