ASCII:8bits的英文编码,实际使用低7位,127个字符。32(0x20)为空格,以前是控制字符,以后是有效字符。 Unicode:使用两字节对全球字符进行统一编码,有65536个编码,UCS-2为两字节版本(2^16 =65536)。 Unicode little endian:将Unicode中表示同一字符的两个字节顺序反过来,为了适应CPU处理字符的方式,加快处理速度。如:把字符”0xFEFF”存为FFEF的格式。 Unicode big endian:Unicode字符编码以正序存储。数组
1、之间的关系: UCS2码是用两个字节表示一个字符,若是字符是ASCII码中的字符,则一个字节为空(值为0),另外一个字节为原ASCII码中的值。如:ASCII中的a,用UCS2表示为0a或a0。因此UCS2字符中的两个字节有个字节顺序问题,0a为大端,a0为小端。所以,在把UCS2字符转换成其它字符时,要先清楚字节顺序。函数
2、MTK 中的类型定义: U8 —— UINT8, unsigned char U16 —— UINT16, unsigned short U32 —— UINT32,unsigned long S8 —— SINT8,char S16 —— SINT16, short S32 —— SINT32, longui
3、ASCII与UCS2转换: 在MTK中有专门的转换函数如:mmi_asc_to_ucs2(S8* pOutbuffer, S8* pInputbuffer); 假设现有一ASCII数组:char asc_str[20]; 若是转为U8则需声明UCS2的数组大小为ASCII数组大小的两倍,U8 ucs_u8_str[40]; 若是转为U16则声明的UCS2数组大小能够和ASCII数组大小同样,U16 ucs_u16_str[20]; 由于UCS2是用两个字节表示ASCII中的一个字节的,因此若是声明为U8 ucs_u8_str[20];的话,会使的转换结果溢出。(由于你们都是char类型嘛),而声明为U16的话就不须要使其大小为ASCII码数组大小的两倍了,只须要同样大小就能够了,由于U16是unsigned short类型,长度正好是char的两倍,因此正好用2个字节表示ASCII中的一个字节。 在MTK中可以用void gui_print_text(U16* text);函数输出的都是Unicode。编码
4、UNICODE和ASCII的存储: 存成ASCII形式:如: char num [10] = {0}; num[0] = '1'; num[1] = '2'; num[2] = '3'; (或者: strcat((char *) num, "1"); strcat((char *) num, "2"); strcat((char *) num, "3");也能够) 在内存中num = {0x31, 0x32, 0x33, 0x00……}; 若是是用UNICODE形式存的话: char num [10] = {0}; UCS2Strcat((char *)num, L"1"); UCS2Strcat((char *)num, L"2"); UCS2Strcat((char *)num, L"3"); (但此处不能用 num[0] = L'1'; num[1] = L'2'; num[2] = L'3';由于以UNICODE形式存的话,系统就会强行把0x31,0x00放到一个char元素里面,结果会出错。因此只能用UCS2Strcat()函数,不然的话就要把num声明为U16类型的也能够直接赋值。) 在内存中num = {0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x00……}; UNICODE每一个字符占两个字节。ASCII占一个。如:字符‘A’在内存中的表现: unicode定义:wchar_t ch = 'A'; 内存存放两个字节0x41, 0x00 ;//小端存储格式,即高字节在高字位,若是存为0x00, 0x41时,那存储格式为大端,即高字节在低字位 ascii定义:char ch ='A'; 内存存放一个字节0x41.net
5、UNICODE和ASCII的处理: char num_text[] = {0x56, 0x00, 0xF7, 0x53, 0x1A, 0xFF, 0x00, 0x00};//text号 在MTK中ASCII和UCS2分别有不一样的处理函数,因此二者处理起来也不一样: char* strcat (char*, const char*); strcpy(char *, const char *)等用于处理ASCII类型的字符。 S8 *UCS2Strcpy(S8 *strDestination, const S8 *strSource);S8 *UCS2Strcat(S8 *strDestination, const S8 *strSource);等用于处理UNICODE类型的字符。 二者区别在于,用于处理ASCII的函数在处理字符串的时候是单个字符逐个处理的,也就是碰到0x00就当即结束了。如:在处理“text号”字符串的时候,因为“text号”字符串的第二个元素是0x00,因此就会在此结束。 而处理UNICODE的函数在处理字符串的时候是两个字符一块儿处理的,也就是把“text号”字符串中的第一个和第二个元素看作一个字符,一块儿处理,也就是直到碰到连续的两个0x00才会结束。code
6、UNICODE保存: MTK中U8和U16的保存是有区别的。通常U8用的是小端的格式,U16用的是大端的。如: Const U8 ucs2_u8_str[] = {0x41, 0x00, 0x46, 0x00, 0x00, 0x00};//AF Const U16 ucs2_u16_str[] = {0x0041, 0x0046, 0x0000};//AF 上面两个字串都表示”AF”,最后的0x0000表示结束符,若是字串不加结束符,则用gui_print_text()显示出来的结果会在字串的最后多一个方框。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jay_lee_1982/archive/2010/06/04/5648109.aspxblog