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