配色: 字号:
体会——UNICODE与ASCII码的关系(MTK
2012-08-07 | 阅:  转:  |  分享 
  
体会——UNICODE与ASCII码的关系(MTK)

分类:MTK学习资料2012-04-1409:2921人阅读评论(0)收藏举报

ASCII:8bits的英文编码,实际使用低7位,127个字符。32(0x20)为空格,之前是控制字符,之后是有效字符。

Unicode:使用两字节对全球字符进行统一编码,有65536个编码,UCS-2为两字节版本(2^16=65536)。

Unicodelittleendian:将Unicode中表示同一字符的两个字节顺序反过来,为了适应CPU处理字符的方式,加快处理速度。如:把字符”0xFEFF”存为FFEF的格式。

Unicodebigendian:Unicode字符编码以正序存储。

?

一、之间的关系:

UCS2码是用两个字节表示一个字符,如果字符是ASCII码中的字符,则一个字节为空(值为0),另一个字节为原ASCII码中的值。如:ASCII中的a,用UCS2表示为0a或a0。所以UCS2字符中的两个字节有个字节顺序问题,0a为大端,a0为小端。因此,在把UCS2字符转换成其它字符时,要先清楚字节顺序。

?

二、MTK?中的类型定义:

U8?——?UINT8,?unsignedchar

U16?——?UINT16,?unsignedshort

U32?——?UINT32,unsignedlong

S8?——?SINT8,char

S16?——?SINT16,short

S32?——?SINT32,long

?

三、ASCII与UCS2转换:

在MTK中有专门的转换函数如:mmi_asc_to_ucs2(S8pOutbuffer,S8pInputbuffer);

假设现有一ASCII数组:charasc_str[20];

如果转为U8则需声明UCS2的数组大小为ASCII数组大小的两倍,U8ucs_u8_str[40];

如果转为U16则声明的UCS2数组大小可以和ASCII数组大小一样,U16ucs_u16_str[20];

因为UCS2是用两个字节表示ASCII中的一个字节的,所以如果声明为U8ucs_u8_str[20];的话,会使的转换结果溢出。(因为大家都是char类型嘛),而声明为U16的话就不需要使其大小为ASCII码数组大小的两倍了,只需要一样大小就可以了,因为U16是unsignedshort类型,长度正好是char的两倍,所以正好用2个字节表示ASCII中的一个字节。

?

?

在MTK中能够用voidgui_print_text(U16text);函数输出的都是Unicode。

四、UNICODE和ASCII的存储:

存成ASCII形式:如:

charnum[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形式存的话:

charnum[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_tch=''A'';?内存存放两个字节0x41,0x00?;//小端存储格式,即高字节在高字位,如果存为0x00,0x41时,那存储格式为大端,即高字节在低字位

ascii定义:charch=''A'';?内存存放一个字节0x41

?

五、UNICODE和ASCII的处理:

charnum_text[]={0x56,0x00,0xF7,0x53,0x1A,0xFF,0x00,0x00};//text号

在MTK中ASCII和UCS2分别有不同的处理函数,所以两者处理起来也不同:

charstrcat(char,constchar);strcpy(char,constchar)等用于处理ASCII类型的字符。

S8UCS2Strcpy(S8strDestination,constS8strSource);S8UCS2Strcat(S8strDestination,constS8strSource);等用于处理UNICODE类型的字符。

两者区别在于,用于处理ASCII的函数在处理字符串的时候是单个字符逐个处理的,也就是碰到0x00就立即结束了。如:在处理“text号”字符串的时候,由于“text号”字符串的第二个元素是0x00,所以就会在此结束。

而处理UNICODE的函数在处理字符串的时候是两个字符一起处理的,也就是把“text号”字符串中的第一个和第二个元素看做一个字符,一起处理,也就是直到碰到连续的两个0x00才会结束。

?

六、UNICODE保存:

MTK中U8和U16的保存是有区别的。一般U8用的是小端的格式,U16用的是大端的。如:

ConstU8ucs2_u8_str[]={0x41,0x00,0x46,0x00,0x00,0x00};//AF

ConstU16ucs2_u16_str[]={0x0041,0x0046,0x0000};//AF

上面两个字串都表示”AF”,最后的0x0000表示结束符,如果字串不加结束符,则用gui_print_text()显示出来的结果会在字串的最后多一个方框。



献花(0)
+1
(本文系小云蔡首藏)