c++ 如何在Unicode中将字符串转换为wchar*

mzsu5hc0  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(269)

我试着定义一个这样的函数:

#ifdef _UNICODE
LPCTSTR A2T(const string& str); 
#else
#define A2T
#endif

如果我的项目是在Ansi中,那么A2T(str)就是str本身。当我的项目是在unicode中时,A2T(str)返回LPCTST类型

at0kjp5o

at0kjp5o1#

当定义了UNICODE时,LPCTSTRconst wchar_t*的别名,否则是const char*的别名。
您当前的宏返回const wchar_t*(Unicode),但返回std::string(Ansi)。这是没有意义的。您将无法在需要LPCTSTR的任何地方始终使用A2T()。代码甚至不会编译为Ansi,因为std::string不能直接分配给char*。对于Unicode,代码将编译为但是你会有内存泄漏,因为从std:stringwchar_t*的转换需要动态的内存分配,你最终必须释放它。
一个更好的选择是让A2T()返回std::wstring(对于Unicode)和std::string(对于Ansi):

#ifdef UNICODE
std::wstring A2T(const string& str)
{
    std::wstring result;
    // do the conversion from Ansi to Unicode as needed...
    // MultiByteToWideChar(), std::wstring_convert, etc...
    return result;
}
#else
std::string A2T(const string& str)
{
    return str;
}
#endif

或者:

std::basic_string<TCHAR> A2T(const string& str)
{
    #ifdef UNICODE
    std::wstring result;
    // do the conversion from Ansi to Unicode as needed...
    // MultiByteToWideChar(), std::wstring_convert, etc...
    return result;
    #else
    return str;
    #endif
}

无论哪种方式,您都可以在转换后获得所需的自动内存管理,并且可以在Ansi和Unicode中一致地使用A2T()(当将A2T(str)的返回值传递给LPCTSTR时,您可以使用A2T(str).c_str())。
或者,您可以直接忘记编写自己的函数,而只是使用MFC/ATL中已有的A2CT()函数或CA2CT类:
ATL and MFC String Conversion Macros

相关问题