学习MBSC和USC

MBSC: multibytes charset,多字节字符集:半角字符占一个字节,全角字符占两个字节;

USC:unicode charset,Unicode字符集:所有字符无论中英还是全角半角,都是每个字符占两个字节;

他们之间的相互转换在win32程序中,用WideCharToMultiByte和MultiByteToWideChar两个函数。

代码:

  1 #include <stdlib.h>
  2 #include <iostream>
  3 
  4 #include <windows.h>
  5 
  6 /***
  7 * @author:zanzan101
  8 */
  9 
 10 using namespace std;
 11 
 12 void foo_s(const char* s)
 13 {
 14     cout << s << endl;
 15 }
 16 
 17 void foo_ws(const wchar_t* ws)
 18 {
 19     wcout << ws << endl;
 20 }
 21 
 22 void w2c(const wchar_t* ws)
 23 {
 24     // char* buff_s = new char[2*(wcslen(ws) + 1)];    // 这里申请的空间过多,如何能得到正好的空间大小呢?
 25 
 26     // 正确方法
 27     size_t n_bytes = 1 + WideCharToMultiByte(0, 0, ws, wcslen(ws), 0, 0, 0, 0);
 28 
 29     // 输出识别出来的字节数,这里一个英文字符:占一个字节;一个中文字符:占两个字节
 30     printf(" %d :", n_bytes);
 31     
 32     char* buff_s = new char[n_bytes];                // 这里申请的正好大小的空间
 33     memset(buff_s, 0, n_bytes);
 34     
 35     WideCharToMultiByte(0, 0, ws, wcslen(ws), buff_s, sizeof ws, 0, 0);
 36     foo_s(buff_s);
 37     delete[] buff_s;
 38 }
 39 
 40 void c2w(const char* s)
 41 {
 42     // size_t n_length = 1 + strlen(s);        // 这里申请的空间也是多了,如何才能得到正好大小的空间呢?
 43     
 44     // 正确方法
 45     size_t n_length = 1 + MultiByteToWideChar(0, 0, s, strlen(s), 0, 0);
 46 
 47     // 输出识别出来的字符数,一个英文字符是一个字符,一个中文字符也是一个字符
 48     printf(" %d :", n_length);
 49 
 50     wchar_t* buff_ws = new wchar_t[n_length];
 51     memset(buff_ws, 0, sizeof(wchar_t) * n_length);
 52     
 53     MultiByteToWideChar(0, 0, s, strlen(s), buff_ws, n_length);
 54     foo_ws(buff_ws);
 55     delete[] buff_ws;
 56 }
 57 
 58 int _tmain(int argc, _TCHAR* argv[])
 59 {
 60     // 多字节字符集,Muti Bytes Charset
 61     // 简称:MBCS
 62     char s[] = "你好";
 63     char s_en[] = "Hello";
 64     wchar_t ws[] = L"你好";
 65     wchar_t ws_en[] = L"Hello";
 66     printf("!!! 注意每个字符串后面都有字符'\\0'\n");
 67     // 多字节的英文字符占一个字节,中文字符占两个字节
 68     printf("MBCS:sizeof(\"你好\")\t= %d\n", sizeof s);
 69     printf("MBCS:sizeof(\"Hello\")\t= %d\n", sizeof s_en);
 70     printf("MBCS:strlen(\"你好\")\t= %d\n", strlen(s));
 71     printf("MBCS:strlen(\"Hello\")\t= %d\n", strlen(s_en));
 72 
 73     printf("\n");
 74 
 75     // Unicode每一个字符都占两个字节(所以叫宽字节...),无论中文字符还是英文字符,都占两个字节
 76     printf("UCS2:sizeof(\"你好\")\t= %d\n", sizeof ws);
 77     printf("UCS2:sizeof(\"Hello\")\t= %d\n", sizeof ws_en);
 78     printf("UCS2:wcslen(\"你好\")\t= %d\n", wcslen(ws));
 79     printf("UCS2:wcslen(\"Hello\")\t= %d\n", wcslen(ws_en));
 80 
 81     printf(">> 多字节的情况:\n");
 82     printf("%s\n", s);
 83     foo_s(s_en);
 84 
 85 
 86     printf(">> Unicode的情况:\n");
 87     // 没有setlocale的话下面那两句都无法输出
 88     // 第二参数""表示使用系统默认的
 89     setlocale(LC_ALL, "");
 90     
 91     // 下面的语句无法正常输出
 92     // printf("%s\n", ws);
 93 
 94     // 下面语句无法编译通过
 95     // wprintf("%s\n", ws);
 96     
 97     // 正确做法
 98     wprintf(L"%s\n", ws);
 99 
100     foo_ws(ws_en);
101 
102     printf(">> 相互转换:\n");
103 
104     printf("w2c:\n");
105     w2c(ws);
106     w2c(ws_en);
107 
108     printf("c2w:\n");
109     c2w(s);
110     c2w(s_en);
111 
112     system("pause");
113     return 0;
114 }

输出结果:

!!! 注意每个字符串后面都有字符'\0'
MBCS:sizeof("你好")     = 5
MBCS:sizeof("Hello")    = 6
MBCS:strlen("你好")     = 4
MBCS:strlen("Hello")    = 5

UCS2:sizeof("你好")    = 6
UCS2:sizeof("Hello")   = 12
UCS2:wcslen("你好")    = 2
UCS2:wcslen("Hello")   = 5
>> 多字节的情况:
你好
Hello
>> Unicode的情况:
你好
Hello
>> 相互转换:
w2c:
 5 :你好
 6 :Hell
c2w:
 3 :你好
 6 :Hello
请按任意键继续. . .

>>转载请注明出处<<

posted @ 2013-10-25 21:05  铁甲小宝  阅读(500)  评论(0)    收藏  举报