如何将 std::wstring 转换为 const TCHAR*?
Posted
技术标签:
【中文标题】如何将 std::wstring 转换为 const TCHAR*?【英文标题】:How to convert std::wstring to a const TCHAR*? 【发布时间】:2021-07-05 18:25:13 【问题描述】:我有以下 wstring:
std::wstring testVal("Test");
我需要把它放在这个值里面:
static const TCHAR* s_test_val;
到目前为止我已经尝试过:
static const TCHAR* s_test_val = (const wchar_t*) testVal.c_str();
static const TCHAR* s_test_val = (wchar_t*) testVal.c_str();
static const TCHAR* s_test_val = (TCHAR*) testVal.c_str();
static const TCHAR* s_test_val = (TCHAR*) testVal;
但没有成功; s_test_val 一直显示为空字符串。
【问题讨论】:
早在 1990 年代后期,Microsoft 有两个操作系统系列,基于 ANSI 的 Windows 9X 和基于 Unicode 的 Windows NT。为了方便程序员为两个 OS 行编写相同的代码,微软隐藏了一系列宏背后的差异,这些宏根据编译器选项在 ANSI 字符和 Unicode 字符之间来回切换,TCHAR
是其中之一那些宏。在 2000 年代初期,Windows NT 几乎用 Windows XP 彻底消灭了 Windows 9X,而且可能您在过去 15 年中使用的每台 Windows 计算机都使用 Unicode。
除非出于某种原因您需要支持 20 多年前的 Windows 操作系统以及现代操作系统,否则您不应该使用 TCHAR
并使用宽字符和各种 ...w 函数或确保在编译时指定了 unicode。不过,如果您只是破解某些东西,您可能会为了简单起见坚持使用 8 位字符。
【参考方案1】:
static const TCHAR* s_test_val = testVal.c_str();
在UNICODE
被定义的情况下这是正确的,在这种情况下TCHAR
将是wchar_t
的别名。
如果UNICODE
未定义,则您需要执行一些转换,但支持非 unicode 构建可能不值得。在这种情况下,您使用强制转换的尝试会默默地做错误的事情,而这会安全地产生错误。
如果您不关心非 unicode 支持(而且我想不出任何人会关心的原因),那么我建议您完全减少使用 TCHAR
。
【讨论】:
你想不出为什么会有人关心unicode? :D 如何定义 UNICODE? @user3400351 你的编译器手册是怎么说的?【参考方案2】:不要使用TCHAR
,除非 Windows 9x 支持是必不可少的。此外,指向自动变量的静态指针非常可疑。你要么想要:
static wchar_t constexpr const* s_test_val = L"Test";
或
std::wstring testVal = L"Test";
wchar_t const* s_test_val = testVal.c_str();
或
std::wstring testVal = L"Test";
auto const s_test_val = testVal.c_str();
【讨论】:
这不起作用。我无法更改变量中的任何内容,只需找到将 wchar_t 转换为 UNICODE 的方法 @user3400351 它是已经 Unicode,那么您要准确转换什么?当UNICODE
被定义时,TCHAR
映射到wchar_t
以上是关于如何将 std::wstring 转换为 const TCHAR*?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 std::wstring 转换为 const TCHAR*?
将 std::string 转换为 std::wstring 时,C++17 codecvt 抛出“错误转换”
如何将CString和:: std :: string :: std :: wstring互相转换?