C++ 从LPWSTR转换为LPTSTR

C++ 从LPWSTR转换为LPTSTR,c++,C++,我正在尝试将参数LPWSTR转换为LPTSTR,我是否可以使用任何库来轻松转换字符串?LPTSTR的定义如下: #ifdef UNICODE typedef LPWSTR LPTSTR; #else typedef LPSTR LPTSTR; #endif 因此,您只需将字符集切换到Unicode即可。例如,在Visual Studio中,您可以转到配置属性->常规->字符集->使用Unicode字符集。如果定义了\u Unicode,则不需要进行转换-aTCHAR是WCHAR,而LPWS

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

LPTSTR的定义如下:

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

因此,您只需将字符集切换到Unicode即可。例如,在Visual Studio中,您可以转到配置属性->常规->字符集->使用Unicode字符集。

如果定义了
\u Unicode
,则不需要进行转换-a
TCHAR
WCHAR
,而
LPWSTR
LPTSTR
;否则,
TCHAR
CHAR
LPTSTR
LPSTR
。在最后一种情况下,您可以使用API将
LPWSTR
(即Unicode字符串)转换为“窄”字符串

此外,您还可以使用
wcstombs
C库函数,假设Windows类型
CHAR
WCHAR
映射到C类型
CHAR
WCHAR\u t
(在VC++中肯定是这样),并且当前的C语言环境是您打算用于转换的语言环境


另请参见Alf的评论,以了解更多关于此问题的见解-最重要的一点是,如果可以,您应该避免这种转换,因为您的输出编码通常不能忠实地表示输入,并且,根据您的字符串表示的内容,这可能意味着乱码文本以及找不到所需的文件,或者更糟糕的是,走错了路

因此,将您的项目设置为使用Unicode(如@prazuber的回答中所示),并始终尝试使用支持Unicode的API,以避免这种转换


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

这是我第一次查看ofc,我已经查看了很长时间,找不到对此的好用户…看这里,它有一些好信息@jesuplusplus:这真的不能用谷歌搜索。我们可以找到一些简单的答案(包括下面的),但它们大多都是错误的或头脑错误的。好吧,这比你的答案显示的要简单得多,也要复杂得多。首先是复杂度:如果宽字符串是一个路径,
LPTSTR
是一个窄字符串,收件人使用它打开文件或目录,并且必须进行转换,那么需要的不仅仅是简单的编码转换,因为信息内容应该被保留(路径所指)。一种解决方案是在必要时转换为短路径。关于简单的解决方案,它是(如果适用):在Windows 9x中不支持MFC DLL,这意味着不需要使用愚蠢的
T
东西。读者还应该注意,
wcstombs
是一个全有或全无的东西:如果只有一个字节它不喜欢,那么它就会完全失败。因此,它不是
WideCharToMultiByte
的替代方案。它有不同的语义,以满足不同的需要。@Cheersandhth.-Alf:正确,一般来说,关于路径的情况特别危险,因为您的应用程序可能需要处理当前CP中无法表示的Unicode路径(另外,默认的
替换字符在路径中可能会有问题)。因此,这个问题的最佳解决方案是,正如您所说的,不要进行“缩小”编码转换,而是在内部使用某种Unicode格式。我将更新我的答案以反映这一点。