博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习MBSC和USC
阅读量:6555 次
发布时间:2019-06-24

本文共 3470 字,大约阅读时间需要 11 分钟。

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

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

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

代码:

1 #include 
2 #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请按任意键继续. . .

>>转载请注明出处<<

转载于:https://www.cnblogs.com/zanzan101/p/3388583.html

你可能感兴趣的文章
MySQL 清理slowlog方法
查看>>
HTTP深入浅出 http请求
查看>>
为YUM设置代理的方法
查看>>
Java 编程的动态性 第1 部分: 类和类装入--转载
查看>>
再谈ABC
查看>>
【转】持久化消息队列之MEMCACHEQ
查看>>
java-Mail
查看>>
Dom4j学习笔记
查看>>
C语言 HTTP上传文件-利用libcurl库上传文件
查看>>
[MEAN Stack] First API -- 7. Using Route Files to Structure Server Side API
查看>>
调试逆向分为动态分析技术和静态分析技术(转)
查看>>
Android webview使用详解
查看>>
业务对象和BAPI
查看>>
程序源系统与当前系统不一致:Carry out repairs in non-original systems only if urgent
查看>>
微软职位内部推荐-Senior Software Engineer
查看>>
程序中的魔鬼数字
查看>>
SVN高速新手教程
查看>>
session cookie
查看>>
如何在Vblock里配置Boot from SAN
查看>>
ZBar之ZBarReaderViewController
查看>>