【问题标题】:Convert from a LPCTSTR to a wchar*从 LPCTSTR 转换为 wchar*
【发布时间】:2013-09-09 18:56:48
【问题描述】:

我有一个 c++ 应用程序,我需要将 LPCTSTR 转换为 wchar*。

是否有执行此转换的函数?

使用 Visual Studio 2k8。

谢谢

【问题讨论】:

  • 如何执行此操作取决于LPCTSTR 是什么。你为什么还在使用TCHAR?你真的还在支持 Windows 98 吗?
  • 如果您在 Unicode 模式下构建,那么它可能已经是。如果你不是,你最好的选择取决于你的解决方案中有哪些库(例如 ATL 或 MFC),但总是有 MultiByteToWideChar。
  • LPCTSTR 包含一个以空字符结尾的宽字符串。我在问题的任何地方都没有看到 TCHAR。这是一个遗留应用程序 - 我无法控制该应用程序。
  • LPCTSTR 中的 T 表示它是基于 TCHAR 的。 (LP = 长/远指针,C = 常量,STR = 字符串)
  • ... 除非您在 QT 领域并且您正在使用表示 wchar_t 是与 unsigned short 不同的 C++ 类型的标志进行编译。但希望你不是。

标签: visual-c++


【解决方案1】:

从 cmets,您正在为 Unicode 进行编译。在这种情况下,LPCTSTR 的计算结果为 const wchar_t*,因此无需转换。如果您需要一个可修改的缓冲区,那么您可以分配一个并执行内存复制。之所以有效,是因为该字符串已在 UTF-16 中编码。

由于您使用的是 C++,因此将字符串存储在字符串类中而不是使用原始 C 字符串是有意义的。例如,您可以使用std::wstring。或者您可以使用MFC/ATL string classes。这些选项中的哪一个最适合您取决于您​​的代码库其余部分的具体情况。

【讨论】:

  • 他的问题或 cmets 中没有任何内容说他正在编译 unicode。 const wchar_t* 也与 wchar_t* 不同
  • @pm100 cmets 说:LPCTSTR 包含一个空终止的宽字符串。 当然,const wchar_t*wchar_t* 不同。我没有说这些类型是相同的。
【解决方案2】:

LPCTSTR 可以是多字节或 Unicode,在编译时确定。 WinNT.h 定义如下

#ifdef UNICODE
    typedef LPCWSTR LPCTSTR;
#else
    typedef LPCSTR LPCTSTR
#endif

这意味着它已经由wchar 组成,正如 Rup 在评论中指出的那样。因此,您可能需要检查 UNICODE 并在未定义的情况下使用 MultiByteToWideChar()。当然,您需要知道字符串使用的代码页,这取决于它的来源和来源。 MultiByteToWideChar documentation 有很好的代码示例。

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2017-11-10
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多