gpt4 book ai didi

c++ - 如何将字符串转换为 unicode 中的 wchar*

转载 作者:行者123 更新时间:2023-11-28 05:33:50 28 4
gpt4 key购买 nike

我正在尝试定义这样的函数:

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

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

最佳答案

当定义了UNICODE时,LPCTSTRconst wchar_t*的别名,否则是const char*的别名

您当前的宏为 Unicode 返回 const wchar_t*,但为 Ansi 返回 std::string。那没有意义。您将无法在所有需要 LPCTSTR 的地方始终如一地使用 A2T()。由于 std::string 不能直接分配给 char*,因此代码甚至无法针对 Ansi 进行编译。对于 Unicode,代码可以编译,但是您会遇到内存泄漏,因为从 std:stringwchar_t* 的转换需要动态内存分配,您最终必须释放该内存.

更好的选择是让 A2T() 为 Unicode 返回 std::wstring,为 Ansi 返回 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 )LPCTSTR,您可以使用 A2T(str).c_str())。

或者,您可以简单地忘记编写自己的函数,而只使用现有的 A2CT() 函数或 MFC/ATL 中已有的 CA2CT 类:

ATL and MFC String Conversion Macros

关于c++ - 如何将字符串转换为 unicode 中的 wchar*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com