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之间的转换。
lpDefaultChar和pfUsedDefaultChar:只有当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());
没有坚守就没有事业,没有执着就没有未来!
浙公网安备 33010602011771号