【问题标题】:converting LPWSTR to char*/string将 LPWSTR 转换为 char*/string
【发布时间】:2012-03-08 10:33:58
【问题描述】:

我的函数 GetErrorString() 被传递了一个错误代码,它要么是 WSAGetLastError() 的结果,要么是我的 DLL 中定义的错误代码之一,当对我的 DLL 函数的调用无法完成时返回。

我有一个 std::pairs 数组,用于存储我的错误代码及其 const char* 错误字符串

std::pair<int, const char*> errorCodeArray[12] =
{ 
    std::pair<int,char*>(0,"Success"),
    std::pair<int,char*>(1,"Connection Error"),
    std::pair<int,char*>(2,"Request Timed Out"),
    // ..etc
};

如果错误代码来自 WSAGetLastError() 那么我必须使用 FormatMessage 将错误字符串作为 LPWSTR 获取,然后将其转换为 char*,我找到了这个页面:

How do I convert from LPCTSTR to std::string?

并尝试了这个显然适用于 LPCTSTR 的灵魂

int size = WideCharToMultiByte(CP_ACP, 0, errCode, -1, 0, 0, NULL, NULL);
char* buf = new char[size];
WideCharToMultiByte(CP_ACP, 0, errCode, -1, buf, size, NULL, NULL);
std::string str(buf);
delete[] buf;
return str.c_str();

但它似乎不适用于 LPWSTR,结果总是“???????????”而且我对字符编码的理解还不够,无法找到解决方案。

任何人都可以对此有所了解吗?谢谢。

【问题讨论】:

  • LPTSTR 更改为 LPWSTR 或 LPSTR,具体取决于项目设置中的字符编码。如果您的 FormatMessage 是 FormatMessageW 的宏,您不能使用 wstring 代替 string 吗?

标签: c++ string character-encoding


【解决方案1】:

FormatMessage() 提供两个函数:

  • FormatMessageA()
  • FormateMessageW()

明确使用FormatMessageA() 以避免转换的必要性。

虽然这并不能直接回答问题,但它提供了一个解决方案,消除了从 LPWSTR 转换为 char* 的要求。

【讨论】:

  • 感谢 hmjd,这比我尝试的要简单得多
  • 确切地说,*A 函数是 *W 函数的包装器,使用默认代码页为您进行转换。所以,从某种意义上说,这是一个直接的答案。
【解决方案2】:

您可能想查看 wcstombs 函数来转换它

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 2016-07-20
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2016-06-07
    • 2016-11-13
    相关资源
    最近更新 更多