zoukankan      html  css  js  c++  java
  • UNICODE与ASCII码的关系(MTK)

    ASCII:8bits的英文编码,实际使用低7位,127个字符。32(0x20)为空格,之前是控制字符,之后是有效字符。 Unicode:使用两字节对全球字符进行统一编码,有65536个编码,UCS-2为两字节版本(2^16 =65536)。 Unicode little endian:将Unicode中表示同一字符的两个字节顺序反过来,为了适应CPU处理字符的方式,加快处理速度。如:把字符”0xFEFF”存为FFEF的格式。 Unicode big endian:Unicode字符编码以正序存储。

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

    二、MTK 中的类型定义: U8 —— UINT8, unsigned char U16 —— UINT16, unsigned short U32 —— UINT32,unsigned long S8 —— SINT8,char S16 —— SINT16, short S32 —— SINT32, long

    三、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。

    四、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

    五、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才会结束。

    六、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.aspx

  • 相关阅读:
    ubuntu 安装 redis desktop manager
    ubuntu 升级内核
    Ubuntu 内核升级,导致无法正常启动
    spring mvc 上传文件,但是接收到文件后发现文件变大,且文件打不开(multipartfile)
    angular5 open modal
    POJ 1426 Find the Multiple(二维DP)
    POJ 3093 Margritas
    POJ 3260 The Fewest Coins
    POJ 1837 Balance(二维DP)
    POJ 1337 A Lazy Worker
  • 原文地址:https://www.cnblogs.com/kevin860/p/11075191.html
Copyright © 2011-2022 走看看