你如何正确使用WideCharToMultiByte

我已经阅读WideCharToMultiByte的文档,但我坚持这个参数:

lpMultiByteStr [out] Pointer to a buffer that receives the converted string. 

我不太清楚如何正确地初始化variables并将其馈送到函数中

这里有几个函数(基于Brian Bondy的例子),使用WideCharToMultiByte和MultiByteToWideChar在std :: wstring和std :: string之间使用utf8进行转换,不丢失任何数据。

 // Convert a wide Unicode string to an UTF8 string std::string utf8_encode(const std::wstring &wstr) { if( wstr.empty() ) return std::string(); int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL); std::string strTo( size_needed, 0 ); WideCharToMultiByte (CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL); return strTo; } // Convert an UTF8 string to a wide Unicode String std::wstring utf8_decode(const std::string &str) { if( str.empty() ) return std::wstring(); int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0); std::wstring wstrTo( size_needed, 0 ); MultiByteToWideChar (CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed); return wstrTo; } 

详细阐述Brian R. Bondy提供的答案 :下面是一个例子,它显示了为什么不能简单地将输出缓冲区的大小设置为源string中宽字符的数目:

 #include <windows.h> #include <stdio.h> #include <wchar.h> #include <string.h> /* string consisting of several Asian characters */ wchar_t wcsString[] = L"\u9580\u961c\u9640\u963f\u963b\u9644"; int main() { size_t wcsChars = wcslen( wcsString); size_t sizeRequired = WideCharToMultiByte( 950, 0, wcsString, -1, NULL, 0, NULL, NULL); printf( "Wide chars in wcsString: %u\n", wcsChars); printf( "Bytes required for CP950 encoding (excluding NUL terminator): %u\n", sizeRequired-1); sizeRequired = WideCharToMultiByte( CP_UTF8, 0, wcsString, -1, NULL, 0, NULL, NULL); printf( "Bytes required for UTF8 encoding (excluding NUL terminator): %u\n", sizeRequired-1); } 

而输出:

 Wide chars in wcsString: 6 Bytes required for CP950 encoding (excluding NUL terminator): 12 Bytes required for UTF8 encoding (excluding NUL terminator): 18 

您可以通过创build一个新的char数组来使用lpMultiByteStr [out]参数。 然后你通过这个char数组来填充它。 您只需要初始化string+ 1的长度,以便在转换后可以有一个以空字符结尾的string。

这里有几个对你有帮助的函数,它们显示了所有参数的用法。

 #include <string> std::string wstrtostr(const std::wstring &wstr) { // Convert a Unicode string to an ASCII string std::string strTo; char *szTo = new char[wstr.length() + 1]; szTo[wstr.size()] = '\0'; WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, szTo, (int)wstr.length(), NULL, NULL); strTo = szTo; delete[] szTo; return strTo; } std::wstring strtowstr(const std::string &str) { // Convert an ASCII string to a Unicode String std::wstring wstrTo; wchar_t *wszTo = new wchar_t[str.length() + 1]; wszTo[str.size()] = L'\0'; MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wszTo, (int)str.length()); wstrTo = wszTo; delete[] wszTo; return wstrTo; } 

任何时候在文档中,当你看到它有一个参数是指向一个types的指针时,它们会告诉你它是一个outvariables,你需要创build这个types,然后传入一个指针。 该函数将使用该指针来填充您的variables。

所以你可以更好地理解这一点:

 //pX is an out parameter, it fills your variable with 10. void fillXWith10(int *pX) { *pX = 10; } int main(int argc, char ** argv) { int X; fillXWith10(&X); return 0; }