ASCII与unicode的区别

一、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];

/*U162个字节,申请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传空指针会死机。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值