首页 > 解决方案 > 将 TCHAR 转换为 wstring

问题描述

TCHAR path[_MAX_PATH+1]; 
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));

或者

TCHAR path[_MAX_PATH]; 
std::wstring ws(&path[0]);

虽然将 a 转换TCHAR wstring 两者都是正确的?

我只是要求澄清,我怀疑我是否正确转换它。

标签: c++

解决方案


该代码在几个方面存在问题。

首先,std::wstring是一串wchar_t(aka WCHAR) 而TCHAR可能是CHARWCHAR,具体取决于配置。所以要么使用WCHARand std::wstring,要么TCHARand std::basic_string<TCHAR>(记住这std::wstring只是一个 typedef std::basic_string<WCHAR>)。

其次,问题在于字符串长度。这个片段:

WCHAR path[_MAX_PATH];
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));

将创建一个长度为 的字符串_MAX_PATH + 1,加上一个终止的空值(并且可能带有嵌入的空值,C++ 字符串允许这样做)。可能不是你想要的。

另一个:

WCHAR path[_MAX_PATH+1]; 
...
std::wstring ws(&path[0]);

期望在构造path时保存一个以 null 结尾的字符串ws,并将其复制到ws. 如果path碰巧不是以空值终止的,则会出现 UB(通常是垃圾输入ws或访问冲突)。

如果您path的是以null 结尾或包含-length_MAX_PATH字符串,我建议像这样使用它:

WCHAR path[_MAX_PATH+1];
... // fill up to _MAX_PATH characters
path[_MAX_PATH] = L'0'; // ensure it is null-terminated
std::wstring ws(path); // construct from a null-terminated string

或者,如果您知道实际长度,只需传递它:

WCHAR path[_MAX_PATH];
size_t length = fill_that_path(path);
std::wstring ws(path, length); // length shouldn’t include the null terminator, if any

请参阅文档(除了不同的 char 类型外,它是相同的)stringwstring


推荐阅读