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 }



原文地址:https://www.cnblogs.com/kex1n/p/2279323.html