【问题标题】:Convert from LPWSTR to LPTSTR从 LPWSTR 转换为 LPTSTR
【发布时间】:2012-12-17 03:53:35
【问题描述】:

我正在尝试将参数 LPWSTR 转换为 LPTSTR,我可以使用任何库来轻松进行字符串转换吗?

【问题讨论】:

  • 这是我看的第一个地方,我已经四处寻找了很长时间,找不到任何好的遮阳篷......
  • 看看这里有一些很好的信息msdn.microsoft.com/en-us/library/windows/desktop/…
  • @JesusPlusPlus:这真的不能用谷歌搜索。有很多可以找到的答案(包括下面),但它们大多都是错误的或错误的。

标签: c++


【解决方案1】:

如果定义了 _UNICODE,则无需进行转换 - TCHARWCHARLPWSTRLPTSTR;否则,TCHARCHARLPTSTRLPSTR。在最后一种情况下,您可以使用 WideCharToMultiByte API 将 LPWSTR(即 Unicode 字符串)转换为“窄”字符串。

此外,您可以使用wcstombs C 库函数,假设 Windows 类型 CHARWCHAR 映射到 C 类型 charwchar_t(在 VC++ 中肯定是这种情况),并且当前的 C 语言环境是您打算用于转换的语言环境。


另请参阅 Alf 的 cmets 以了解有关此问题的更多信息 - 最重要的一点是,如果可以,您应该避免此类转换,因为您的输出编码general 不能忠实地表示输入,并且根据您的字符串表示的内容,这可能意味着乱码文本以及找不到所需的文件,或者更糟糕的是,在错误的路径上操作。

因此,请将您的项目设置为使用 Unicode(如 @prazuber 的回答)并始终尝试使用可识别 Unicode 的 API,以避免这种转换。

不过,请记住,仅使用 Unicode 版本的 Windows API 可能意味着失去与 Windows 9x 的兼容性;对于绝大多数情况这不是问题,但如果在您的应用程序中支持此类操作系统至关重要,请检查您使用的 API 是否在 MSLU 中受支持。

【讨论】:

  • 嗯,这比您的回答表明的要容易得多,也要复杂得多。首先是复杂性:如果宽字符串是路径,而LPTSTR是窄字符串,并且接收者用它打开文件或目录,并且必须进行转换,那么需要的不仅仅是简单的编码转换,因为应该保留信息内容(路径所指的内容)。一种解决方案是在必要时转换为短路径。关于简单的解决方案,它是(如果适用):不支持 Windows 9x 中的 MFC DLL,这意味着,不需要使用愚蠢的 T 东西。
  • 读者还应该注意wcstombs 是一个全有或全无的东西:如果只有一个字节它不喜欢,那么它就完全失败了。所以它不是WideCharToMultiByte 的替代品。它有不同的语义,满足不同的需求。
  • @Cheersandhth.-Alf:正确,一般来说,关于路径的情况特别危险,因为您的应用程序可能必须处理当前 CP 中无法表示的 Unicode 路径(也是默认的? 替换字符在路径中可能有问题)。所以,这个问题的最佳解决方案是,正如您所说,不要进行“缩小”编码转换,而是在内部以某种 Unicode 格式工作。我会更新我的答案以反映这一点。
【解决方案2】:

LPTSTR 定义如下:

#ifdef UNICODE
 typedef LPWSTR LPTSTR;
#else
 typedef LPSTR LPTSTR;
#endif

因此,您只需将字符集切换为 Unicode。例如,在 Visual Studio 中,您转到 Configuration Properties -> General -> 字符集 -> 使用 Unicode 字符集 em>。

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 2010-09-25
    • 1970-01-01
    • 2016-06-07
    • 2011-10-15
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多