zoukankan      html  css  js  c++  java
  • dowhile(0)的妙用及MultiByteToWideChar和WideCharToMultiByte的用法

    需求:屏幕上显示字体的时候,若字数过多需要分行显示(分2行),第一行和第二行各占一半的字符。

    由于带显示的字符串为const char* pText = "..."; 

    其中包含有中文,标点符号,英文,数字等等,其中中文用2个字节来表示,其他用1个字节表示。若直接根据这个字符的长度分隔成2部分的话有可能会出现乱码,所以需要转换成宽字节字符后在分割。

     1 int main()
    2 {
    3 const char* pText = "hello, 小楼一夜听春雨,小楼一夜听春雨,小楼一夜听春雨!";
    4 string str1, str2;
    5
    6 wchar_t* pWideStr = NULL;
    7 char* pMultiStr1 = NULL;
    8 char* pMultiStr2 = NULL;
    9
    10 do
    11 {
    12 // param@5--指向接收被转换字符串的缓冲区
    13 // param@6--指定由第5个参数指向的缓冲区的字符个数。
    14 // 若此值为零,函数返回缓冲区所必需的宽字符数,第5个参数不用传NULL
    15 DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, pText, -1, NULL, 0);
    16 pWideStr = new wchar_t[dwNum];
    17 if(!pWideStr)
    18 break;
    19
    20 MultiByteToWideChar (CP_ACP, 0, pText, -1, pWideStr, dwNum);
    21
    22 wstring wstr(pWideStr);
    23 wstring wstr1 = wstr.substr(0, wstr.size() / 2);
    24 wstring wstr2 = wstr.substr(wstr.size() / 2, wstr.size() - wstr.size() / 2);
    25
    26 // param@3--指向将被转换的unicode字符串。
    27 // param@4--指定由第3个参数指向的缓冲区的字符个数。如果这个值为-1,
    28 // 字符串将被设定为以NULL为结束符的字符串,并且自动计算长度。
    29 // param@5--指向接收被转换字符串的缓冲区。
    30 // param@6--指定由参数lpMultiByteStr指向的缓冲区最大值(用字节来计量)。
    31 // 若此值为零,函数返回lpMultiByteStr指向的目标缓冲区所必需的字节数,
    32 // 在这种情况下,第5个参数通常为NULL。
    33 dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wstr1.c_str(), -1, NULL, 0, NULL, FALSE);
    34 pMultiStr1 = new char[dwNum];
    35 if (!pMultiStr1)
    36 break;
    37 WideCharToMultiByte(CP_OEMCP, NULL, wstr1.c_str(), -1, pMultiStr1, dwNum, NULL, FALSE);
    38 str1 = pMultiStr1;
    39
    40 dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wstr2.c_str(), -1, NULL, 0, NULL, FALSE);
    41 pMultiStr2 = new char[dwNum];
    42 if (!pMultiStr2)
    43 break;
    44 WideCharToMultiByte(CP_OEMCP, NULL, wstr2.c_str(), -1, pMultiStr2, dwNum, NULL, FALSE);
    45 str2 = pMultiStr2;
    46
    47 } while (0);
    48
    49 if (pWideStr)
    50 delete [] pWideStr;
    51 if (pMultiStr1)
    52 delete [] pMultiStr1;
    53 if (pMultiStr2)
    54 delete [] pMultiStr2;
    55
    56 cout<<pText<<endl;
    57 cout<<str1<<endl;
    58 cout<<str2<<endl;
    59
    60 return 0;
    61 }



  • 相关阅读:
    一条insert语句批量插入多条记录
    分析器错误消息: 未能加载类型“WebApplication._Default”
    Avi视频生成缩略图时,提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
    DataGridView 的单元格的边框、 网格线样式的设定【转】
    2015届求职经历(转)
    现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值
    给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
    ASP.Net中使用Report Service
    为自己尝试写点东西吧,程序员们!(转)
    ubuntu菜单面板丢了怎么找回
  • 原文地址:https://www.cnblogs.com/kex1n/p/2279323.html
Copyright © 2011-2022 走看看