MBSC: multibytes charset,多字节字符集:半角字符占一个字节,全角字符占两个字节;
USC:unicode charset,Unicode字符集:所有字符无论中英还是全角半角,都是每个字符占两个字节;
他们之间的相互转换在win32程序中,用WideCharToMultiByte和MultiByteToWideChar两个函数。
代码:
1 #include2 #include 3 4 #include 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("你好") = 5MBCS:sizeof("Hello") = 6MBCS:strlen("你好") = 4MBCS:strlen("Hello") = 5UCS2:sizeof("你好") = 6UCS2:sizeof("Hello") = 12UCS2:wcslen("你好") = 2UCS2:wcslen("Hello") = 5>> 多字节的情况:你好Hello>> Unicode的情况:你好Hello>> 相互转换:w2c: 5 :你好 6 :Hellc2w: 3 :你好 6 :Hello请按任意键继续. . .
>>转载请注明出处<<