zoukankan      html  css  js  c++  java
  • 学习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'
    ");
     67     // 多字节的英文字符占一个字节,中文字符占两个字节
     68     printf("MBCS:sizeof("你好")	= %d
    ", sizeof s);
     69     printf("MBCS:sizeof("Hello")	= %d
    ", sizeof s_en);
     70     printf("MBCS:strlen("你好")	= %d
    ", strlen(s));
     71     printf("MBCS:strlen("Hello")	= %d
    ", strlen(s_en));
     72 
     73     printf("
    ");
     74 
     75     // Unicode每一个字符都占两个字节(所以叫宽字节...),无论中文字符还是英文字符,都占两个字节
     76     printf("UCS2:sizeof("你好")	= %d
    ", sizeof ws);
     77     printf("UCS2:sizeof("Hello")	= %d
    ", sizeof ws_en);
     78     printf("UCS2:wcslen("你好")	= %d
    ", wcslen(ws));
     79     printf("UCS2:wcslen("Hello")	= %d
    ", wcslen(ws_en));
     80 
     81     printf(">> 多字节的情况:
    ");
     82     printf("%s
    ", s);
     83     foo_s(s_en);
     84 
     85 
     86     printf(">> Unicode的情况:
    ");
     87     // 没有setlocale的话下面那两句都无法输出
     88     // 第二参数""表示使用系统默认的
     89     setlocale(LC_ALL, "");
     90     
     91     // 下面的语句无法正常输出
     92     // printf("%s
    ", ws);
     93 
     94     // 下面语句无法编译通过
     95     // wprintf("%s
    ", ws);
     96     
     97     // 正确做法
     98     wprintf(L"%s
    ", ws);
     99 
    100     foo_ws(ws_en);
    101 
    102     printf(">> 相互转换:
    ");
    103 
    104     printf("w2c:
    ");
    105     w2c(ws);
    106     w2c(ws_en);
    107 
    108     printf("c2w:
    ");
    109     c2w(s);
    110     c2w(s_en);
    111 
    112     system("pause");
    113     return 0;
    114 }

    输出结果:

    !!! 注意每个字符串后面都有字符''
    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
    请按任意键继续. . .

    >>转载请注明出处<<

  • 相关阅读:
    小爬麦子学院教师
    小爬糗事百科
    小爬需登录的网站之麦子学院
    小爬静态页面图片
    python正则表达式
    使用Coding.net+Hexo+node.js+git来搭建个人博客
    H5键盘事件处理
    获取页面高度等信息
    JavaScript实用的工具/类库
    DOM
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3388583.html
Copyright © 2011-2022 走看看