C++字符串转换用到的API详解

  2018.1.15 ~ 6.15这5个月时间都是改之前完成项目的Bug,主要是界面显示的bug,内存泄漏的bug,部分功能点的bug,现在项目基本成型,从这周开始已经进行了新项目,用Windows C++编程技术,很多东西不会,在此积累知识,详细记录,坚持!

1. WideCharToMultiByte:宽字符 转成 字节字符

  VC12原型:WINAPI

 1 WideCharToMultiByte(
 2     _In_ UINT CodePage,
 3     _In_ DWORD dwFlags,
 4     _In_NLS_string_(cchWideChar) LPCWCH lpWideCharStr,          //lpWideCharStr:指向将被转换的unicode字符串。
 5     _In_ int cchWideChar,                         //cchWideChar:指定由参数lpWideCharStr指向的缓冲区的字符个数。如果这个值为-1,字符串将被设定为以NULL为结束符的字符串,并且自动计算长度。
 6     _Out_writes_bytes_to_opt_(cbMultiByte, return) LPSTR lpMultiByteStr,   //lpMultiByteStr:指向接收被转换字符串的缓冲区。
 7     _In_ int cbMultiByte,          cchMultiByte:指定由参数lpMultiByteStr指向的缓冲区最大值(用字节来计量)。若此值为零,函数返回lpMultiByteStr指向的目标缓冲区所必需的字节数,在这种情况下,lpMultiByteStr参数通常为NULL。
 8     _In_opt_ LPCCH lpDefaultChar,
 9     _Out_opt_ LPBOOL lpUsedDefaultChar
10     );
  百度百科原型
 1 int WideCharToMultiByte(
 2 UINT CodePage,         //指定执行转换的代码页
 3 DWORD dwFlags,         //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符
 4 LPCWSTR lpWideCharStr,     //指定要转换为宽字节字符串的缓冲区
 5 int cchWideChar,          //指定由参数lpWideCharStr指向的缓冲区的字符个数
 6 LPSTR lpMultiByteStr,      //指向接收被转换字符串的缓冲区
 7 int cchMultiByte,          //指定由参数lpMultiByteStr指向的缓冲区最大值
 8 LPCSTR lpDefaultChar,       //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
 9 LPBOOL pfUsedDefaultChar   //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
10 );

使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。

lpDefaultCharpfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。
返回值:如果函数运行成功,并且cchMultiByte不为零,返回值是由 lpMultiByteStr指向的缓冲区中写入的字节数;如果函数运行成功,并且cchMultiByte为零,返回值是接收到待转换字符串的缓冲区所必需的字节数。如果函数运行失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。它可以返回下面所列错误代码:
ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;
ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。
==================================================================================================================

CDuiString和String的转换

  很多时候 难免用到CDuiString和string的转换。我们应该注意到,CDuiString类有个方法:LPCTSTR GetData() const; 可以通过这个方法,把CDuiString变为LPCTSTR ; 所以下一步只是如何把LPCTSTR 转为string了。首先写一个StringFromLPCTSTR函数,完成转换:

 1 std::string StringFromLPCTSTR(LPCTSTR str) {
 2 #ifdef _UNICODE
 3     int size_str = WideCharToMultiByte(CP_UTF8, 0, str, -1, 0, 0, NULL, NULL);
 4 
 5     char* point_new_array = new char[size_str];
 6 
 7     WideCharToMultiByte(CP_UTF8, 0, str, -1, point_new_array, size_str, NULL, NULL);
 8 
 9     std::string return_string(point_new_array);
10     delete[] point_new_array;
11     point_new_array = NULL;
12     return return_string;
13 #else
14     return std::string(str);
15 #endif
16 }

  下面就可以完成duicstring到string的转换了:

1 CDuiString download_link = msg.pSender->GetUserData();
2 std::string download_link_str = StringFromLPCTSTR(download_link.GetData());
posted @ 2018-06-24 10:55  傍风无意  阅读(537)  评论(0)    收藏  举报