如何在unicode中将字符串转换为wchar *

时间:2016-08-06 01:56:12

标签: c++ unicode ansi

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

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

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

1 个答案:

答案 0 :(得分:1)

定义UNICODE后,LPCTSTRconst wchar_t*的别名,否则它是const char*的别名。

您当前的宏为Unicode返回const wchar_t*,但为Ansi返回std::string。这没有意义。您无法在预期的A2T()处始终使用LPCTSTR。由于std::string无法直接分配给char*,因此代码甚至无法为Ansi编译。对于Unicode,代码会编译,但是你会有内存泄漏,因为从std:stringwchar_t*的转换需要动态内存分配,你必须最终释放。

更好的选择是让A2T()为{}返回std::wstring,为安西提供std::string

#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)的返回值传递给{{1}时},你可以使用LPCTSTR)。

或者,您可能只是忘记编写自己的函数,只使用MFC / ATL中已有的现有A2T(str).c_str()函数或A2CT()类:

ATL and MFC String Conversion Macros