【问题标题】:How to convert std::wstring to a TCHAR*?如何将 std::wstring 转换为 TCHAR*?
【发布时间】:2009-12-03 19:51:02
【问题描述】:

如何将std::wstring 转换为TCHAR*std::wstring.c_str() 不起作用,因为它返回 wchar_t*

我如何从wchar_t*TCHAR*,或从std::wstringTCHAR*

【问题讨论】:

  • 请记住,这只有在 wstring 仅包含 ANSI 字符时才有可能。不要期望建议的解决方案的结果始终是正确的字符串。事实上,如果你必须这样做,那可能意味着有问题。请在此处查看我的答案:stackoverflow.com/questions/1049947/… 关于我认为应该如何处理这种情况,完全避免 TCHAR。

标签: c++ unicode tchar


【解决方案1】:

使用这个:

wstring str1(L"Hello world");
TCHAR * v1 = (wchar_t *)str1.c_str();

【讨论】:

  • error C2440: 'initializing' : 无法从 'wchar_t *' 转换为 'TCHAR *'
  • 完美运行。谢谢。
【解决方案2】:
#include <atlconv.h>

TCHAR *dst = W2T(src.c_str());

将在 ANSI 或 Unicode 版本中做正确的事情。

【讨论】:

  • 你需要在W2T前面加上USES_CONVERSION;,否则它会报错:“error C2065: '_lpw': undeclared identifier”等
【解决方案3】:

如果定义了 UNICODE,则 TCHAR* 定义为 wchar_t*,否则为 char*。所以你的代码可能看起来像这样:

wchar_t* src;
TCHAR* result;
#ifdef UNICODE
result = src;
#else
//I think W2A is defined in atlbase.h, and it returns a stack-allocated var.
//If that's not OK, look at the documenation for wcstombs.
result = W2A(src);
#endif

【讨论】:

    【解决方案4】:

    一般中这是不可能的,因为 wchar_t 的大小可能与 TCHAR 不同。

    已经列出了几种用于在字符集之间进行转换的解决方案。如果字符集在要转换的范围内重叠,这些可以工作。

    我更愿意尽可能完全回避这个问题,并使用在 TCHAR 字符集上定义的标准字符串,如下所示:

    typedef std::basic_string&lt;TCHAR&gt; tstring;

    使用这个你现在有一个标准库兼容的字符串,它也与 windows TCHAR 宏兼容。

    【讨论】:

      【解决方案5】:

      你可以使用:

      wstring ws = L"Testing123";
      string s(ws.begin(), ws.end());
      // s.c_str() is what you're after
      

      【讨论】:

        【解决方案6】:

        假设您在 Windows 上操作。

        如果您在 Unicode 构建配置中,那么 TCHARwchar_t 是同一个东西。您可能需要进行强制转换,具体取决于您是否为 wchar_t 设置了 /Z 是一种类型,而 wchar_t 是一种类型定义。

        如果您处于多字节构建配置中,则需要 MultiByteToWideChar(反之亦然)。

        【讨论】:

          猜你喜欢
          • 2021-07-05
          • 2018-11-23
          • 1970-01-01
          • 1970-01-01
          • 2011-03-22
          • 2011-01-03
          • 2012-07-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多