【发布时间】:2012-12-17 03:53:35
【问题描述】:
我正在尝试将参数 LPWSTR 转换为 LPTSTR,我可以使用任何库来轻松进行字符串转换吗?
【问题讨论】:
-
这是我看的第一个地方,我已经四处寻找了很长时间,找不到任何好的遮阳篷......
-
@JesusPlusPlus:这真的不能用谷歌搜索。有很多可以找到的答案(包括下面),但它们大多都是错误的或错误的。
标签: c++
我正在尝试将参数 LPWSTR 转换为 LPTSTR,我可以使用任何库来轻松进行字符串转换吗?
【问题讨论】:
标签: c++
如果定义了 _UNICODE,则无需进行转换 - TCHAR 是 WCHAR,LPWSTR 是 LPTSTR;否则,TCHAR 是 CHAR,LPTSTR 是 LPSTR。在最后一种情况下,您可以使用 WideCharToMultiByte API 将 LPWSTR(即 Unicode 字符串)转换为“窄”字符串。
此外,您可以使用wcstombs C 库函数,假设 Windows 类型 CHAR 和 WCHAR 映射到 C 类型 char 和 wchar_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 的替代品。它有不同的语义,满足不同的需求。
? 替换字符在路径中可能有问题)。所以,这个问题的最佳解决方案是,正如您所说,不要进行“缩小”编码转换,而是在内部以某种 Unicode 格式工作。我会更新我的答案以反映这一点。
LPTSTR 定义如下:
#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif
因此,您只需将字符集切换为 Unicode。例如,在 Visual Studio 中,您转到 Configuration Properties -> General -> 字符集 -> 使用 Unicode 字符集 em>。
【讨论】: