【问题标题】:Issues Converting wstring to TCHAR [duplicate]将 wstring 转换为 TCHAR 的问题 [重复]
【发布时间】:2013-02-06 22:00:52
【问题描述】:

我对编程很陌生,我正在尝试编写一个程序,其中用户输入一个日期,然后将该日期添加到文件目录名称中,然后搜索该文件目录。

下面是我正在处理的内容。我有很多功能可以做到这一点。我在网上搜索并尝试用几种不同的方式进行转换,但我只是不理解它......所以我离开了(我知道的是不正确的)a静态转换。

也许我只是没有正确地进行转换...基本上这会将其返回给使用 WINAPI 处理程序的函数。我能否让它发挥作用是完全不同的故事......提前感谢您的帮助!

wstring fDate;
wstring fileDin;

const TCHAR* s = _T (fileDin);

std::wstring(fDate);
std::wstring(fileDin) =L"Z:\\software\\A\\AC\\" + fDate;
wcout<< fileDin;
cout <<endl;

//wstring fileDin(&arc[1]);
fileDin = static_cast<TCHAR>(arc[1]);
dir(2, arc);

【问题讨论】:

  • 在你的情况下最好避免使用TCHAR

标签: c++ cstring wstring tchar


【解决方案1】:

TCHAR 可以是 wchar_t(使用 Unicode 时)或 char(使用多字节时)。
另一方面,std::wstring 总是包含wchar_t 类型的字符,因此最好直接使用wchar_t* 而不是TCHAR*(如果可能)。

那么wchar_t*std::wstring的转换可以通过std::wstring的构造函数来完成:

wchar_t* wcstr = L"my string";
std::wstring wstr(wcstr);

std::wstringwchar_t* 通过简单的调用c_str() 方法:

wchar_t* wcstr = wstr.c_str();

然后有时您可能需要在“宽”字符串(std::wstrings 持有wchar_t 字符)和多字节字符串(std::strings 持有chars)之间进行转换。我通常使用以下助手:

// multi byte to wide char:
std::wstring s2ws(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

// wide char to multi byte:
std::string ws2s(const std::wstring& wstr)
{
    int size_needed = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), int(wstr.length() + 1), 0, 0, 0, 0); 
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), int(wstr.length() + 1), &strTo[0], size_needed, 0, 0); 
    return strTo;
}

【讨论】:

  • 基于_T(fileDin)编译无误,配置必须设置为TCHARchar。不幸的是,这意味着这个答案不起作用。
  • @MarkRansom:好点。我仍然认为在大多数情况下,使用wchar_t*char* 比使用TCHAR 更直接,因此更好。
  • 同意,TCHAR 是很久以前的遗物。不幸的是,我们中的许多人仍在使用可以追溯到那个时代的代码库,并且出于一致性问题需要继续使用它。
  • 不幸的是,这是在使用 FindFirstFile() 或 FindNextFile() 时给我的代码,我花了很长时间才掌握了它。如果有一种更简单的方法可以从目录中搜索和提取我不知道的文件名,我可能能够绕过整个函数。如果它可以满足我的需要,我可以尝试使用 wchar_t* 重写。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2018-11-23
  • 2021-11-10
  • 2011-11-13
  • 2013-10-18
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多