#include <stdio.h>
#include <string.h>
#define uint16 unsigned short
#define uint8 unsigned char
#define UINT16 unsigned short
#define UINT8 unsigned char
#define int16 short
static int GetUtf8Size(uint16 pInput)
{
uint8 c = (uint8)pInput;
// printf("the c 0x%0x\n",c);
// 0xxxxxxx 返回1, 1byte
// 10xxxxxx 不存在
// 110xxxxx 返回2, 2byte
// 1110xxxx 返回3, 3byte
// 11110xxx 返回4, 4byte
// 111110xx 返回5, 5byte
// 1111110x 返回6, 6byte
if(c< 0x80) return 1;
if(c>=0x80 && c<0xC0) return -1;
if(c>=0xC0 && c<0xE0) return 2;
if(c>=0xE0 && c<0xF0) return 3;
if(c>=0xF0 && c<0xF8) return 4;
if(c>=0xF8 && c<0xFC) return 5;
if(c>=0xFC) return 6;
}
/* **************************************** */
/* Get UTF8 Byte Size */
/* **************************************** */
static int16 UTF8ToUnicode(const uint8 *longName,uint8 *save)
{
int i = 0;
int size ;
int unicodeNameIndex = 0;
int err = 0;
int16 ret;
//while(longName[i] != 0)
if(longName ==NULL||save==NULL)
{
return -1;
}
while((longName[i] != 0) && (err == 0))
{
size = GetUtf8Size(longName[i]);
printf("the size %d \n",size);
switch(size){
case 1:
//no need to transform
save[unicodeNameIndex] = longName[i];
save[unicodeNameIndex+1] = 0x00;
// save[unicodeNameIndex] = longName[i];
i += 1;
unicodeNameIndex +=2;
break;
case 2:
//longName[unicodeNameIndex] = 0x07FF & (longName[i]<<6 | 0x003F & longName[i+1]); // 110xxxxx 10xxxxxx ; mask:is 0x003f for low 6bit, after combine, the unit16 mask is 0x07FF for low 11bits
//i += 2;
//unicodeNameIndex +=1;
save[unicodeNameIndex+1]=(longName[i]<<3)|((longName[i+1]&0x3F)>>3);
save[unicodeNameIndex]=(longName[i+1]&0x07)<<5;
i+=2;
unicodeNameIndex +=2;
break;
case 3:
{
//uint8 *pCur = &longName[i];
//UINT16 value;
//unsigned char obj=0,obj2=0;
//longName[unicodeNameIndex] = longName[i]<<12 | (0x003F & longName[i+1])<<6 |0x003F & longName[i+2] ; // 1110xxxx 10xxxxxx 10xxxxxx => mask: 0x000F 0x003f 0x003f,but the highest byte just need to shift 12bit, the highest 4bit will be clear.
//longName[un]
save[unicodeNameIndex+1]=(longName[i]&0x0f)<<4|((longName[i+1]&0x3c)>>2);
save[unicodeNameIndex]=((longName[i+1]&0x03)<<6)|(longName[i+2]&0x3F);
//printf("the obj1 0x%0x obj2 0x%0x\n",obj,obj2);
i += 3;
unicodeNameIndex +=2;
}
break;
case 4:
printf("Error 44");
err = 1;
break;
case 5:
printf("Error 55");
err = 1;
break;
case 6:
printf("Error 66");
err = 1;
break;
default:
err = 1;
break;
}
}
// longName[unicodeNameIndex] = 0;
ret = unicodeNameIndex;
save[unicodeNameIndex]='\n';
return ret;
}
int main()
{
//char a[10]={0x01,0x00 ,0x02,0x03,0x00,0x040,0x05};
//printf("strlen %d\n",strlen(a));
return 0;
}