【问题标题】:How to convert std::wstring to a const TCHAR*?如何将 std::wstring 转换为 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 位字符。

标签: c++ windows unicode tchar


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多