一、ASCII码与unicode码
1. ASCII:8bits的英文编码,实际使用低7位,127个字符。32(0x20)为空格,之前是控制字符,之后是有效字符。
2. Unicode:使用两字节对全球字符进行统一编码,有65536个编码,UCS-2为两字节版本(2^16 =65536)。
2.1 Unicode little endian:将Unicode中表示同一字符的两个字节顺序反过来,为了适应CPU处理字符的方式,加快处理速度。如:把字符”0xFEFF”存为FFEF的格式。
2.2 Unicode big endian:Unicode字符编码以正序存储。
二、二者的关系
UCS2码是用两个字节表示一个字符,如果字符是ASCII码中的字符,则一个字节为空(值为0),另一个字节为原ASCII码中的值。如:ASCII中的a,用UCS2表示为0a或a0。所以UCS2字符中有个字节顺序问题,0a为大端,a0为小端。因此,在把UCS2字符转换成其它字符时,要先清楚字节顺序。
三、MTK 中的类型定义:
U8 |
unsigned char |
S8 |
char |
U16 |
unsigned short |
S16 |
short |
U32 |
unsigned int |
S32 |
int |
注:char和signed char都为有符号字符,其范围都是-128~127,unsigned char是无符号字符,其范围是0~255,
四、ASCII与UCS2转换:
在MTK中有专门的转换函数如:mmi_asc_to_ucs2(S8* pOutbuffer, S8* pInputbuffer);
一个ASCII数组:char asc_str[20];
如果转为U8则需声明UCS2的数组大小为ASCII数组大小的两倍,U8 ucs_u8_str[40];
/*U8占一个字节,申请40个这样的空间,申请空间的总大小为40个字节*/
如果转为U16则声明的UCS2数组大小可以和ASCII数组大小一样,U16 ucs_u16_str[20];
/*U16占2个字节,申请20个这样的空间,总大小也为40个字节。和转化后的UCS2码数组大小一样*/
在MTK中能够用void gui_print_text(U16* text);函数输出的都是Unicode。
例如gui_print_text((UI_string_type) L"FM Radio");
五、ASCII和Unicode的存储:
5.1 存成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……};
5.2 存成Unicode形式
char num [10] = {0};
mmi_ucs2cat((char *)num, L'1');
mmi_ucs2cat((char *)num, L'2');
mmi_ucs2cat((char *)num, L'3');
但此处不能用
num[0] = L'1';
num[1] = L'2';
num[2] = L'3';
因为以Unicode形式存的话,系统就会强行把0x31,0x00放到一个char元素里面,结果会出错。
所以只能用mmi_ucs2cat()函数,若把num声明为U16类型的也可以直接赋值。在内存中num = {0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x00……};
六、ASCII和Unicode的处理:
char num_text[] = {0x56, 0x00, 0xF7, 0x53, 0x1A, 0xFF, 0x00, 0x00};
在MTK中ASCII和UCS2分别有不同的处理函数,所以两者处理起来也不同:
strcat ()、strcpy()等用于处理ASCII类型的字符[单字节]。
mmi_ucs2cat()、mmi_ucs2cpy()等用于处理Unicode类型的字符[双字节]。
两者区别在于,用于处理ASCII的函数在处理字符串的时候是单个字符逐个处理的,也就是碰到0x00就立即结束了。如:在处理num_text的时候,由于num_text[1]是0x00,所以就会在此结束。
而处理Unicode的函数在处理字符串的时候是两个字符一起处理的,也就是把num_text[0] 、num_text[1]一起处理,即直到碰到连续的两个0x00才会结束。
七、单双字节常用函数
双字节 |
单字节 |
|
比较 |
mmi_ucs2cmp |
strcmp |
复制 |
mmi_ucs2cpy |
strcpy |
拼接 |
mmi_ucs2cat |
strcat |
测长 |
mmi_ucs2strlen |
strlen |
|
mmi_ucs2_to_asc //双->单 |
mmi_asc_to_ucs2//单->双 |
注:关于双字节字符串函数,尽量使用mmi_ucs2len、mmi_ucs2cpy等,不要用mmi_wcslen、mmi_wcscpy等,两者的效果是一样的,但是mmi_ucs2的兼容性更好,允许传空指针,而mmi_wcs传空指针会死机。