程序代码如下:
/** \brief
* 以下实现都是Big Endian格式
* 返回值为utf16字符的长度
* attention :UTF16还能表示一部分的UCS-4代码点
* 这里为了简便就没有添加到代码中
* 因此这里的UTF16其实是UCS-2
* \param dest char* 目标字符串数组首地址
* \param src const char* 源字符串数组首地址
* \param destMaxLen int 目标字符串数组最大长度,防止越界
* \return int 目标字符串的长度
*
*/
int utf8ToUtf16(char *dest,const char *src,int destMaxLen)
{
int destLen=0; //记录目标字符串的长度
int i=0;
char temp;
while(i<strlen(src))
{
if(destMaxLen-destLen>=2)
{
if ((src[i] | '\x7f')=='\x7f')
//U+0000-U+007F
{
dest[destLen++]=0x00;
dest[destLen++]=src[i];
i=i+1;
//源串移动一位
}
else if((src[i] | '\x1f')=='\xdf')
//U+0080-U+07FF
{
dest[destLen++]=((0x1c & src[i])>>2);
dest[destLen++]=((0x3f & src[i+1]))+((0x03 &src[i])*64);
i=i+2;
}
else if((src[i] | '\x0f')=='\xef')
//U+0800-U+FFFF
{
dest[destLen++]=((0x0f & src[i])*16)+((0x3c & src[i+1])>>2);
dest[destLen++]=(0x03 & src[i+1])*64+(0x3f & src[i+2]);
i=i+3;
}
else {
temp=src[i];
printf("%x\n",(temp | 0x0f));
printf("convert error!\n");
break;
}
}
else{
printf("Destination string capicity is not enough!Transformation terminated!\n");
break;
}
}
return destLen;
}