我在尝试将LPCWSTR转换为LPCSTR时遇到了麻烦。
一些背景
我正在编写VC ++ 2010应用程序,并且已经遇到了我必须从类型System :: String ^转换为std :: string的情况。我使用此代码执行此操作:
private: std::string toss(System::String^ s)
{
msclr::interop::marshal_context context;
return context.marshal_as<std::string>(s);
}
这样做,我想我会解决所有问题。我错了。由此,我需要将std :: string转换为LPCSTR,以与某些Windows API一起使用。
在阅读了关于SO的一些现有问题后,我觉得自己被卡住了。有人告诉我使用:
LPCSTR str = existingstr.c_str();
但是当我使用它时,我收到错误:无法从LPCWSTR转换为LPCSTR
有没有人更清楚我在这个特定情况下应该做些什么,或者我如何从LPCWSTR转换为LPCSTR?
提前致谢。
答案 0 :(得分:4)
在wchar和基于字符的字符串之间来回转换时,我使用以下两个例程:
include <string> // std::string, std::wstring
include <algorithm> // std::copy
std::wstring StringToWString(const std::string& s)
{
std::wstring temp(s.length(),L' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
std::string WStringToString(const std::wstring& s)
{
std::string temp(s.length(), ' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
您现在可以通过以下方式解决您的问题,假设'existingstr'是一个宽字符串字符串:
std::string narrow_str(WStringToString(existingstr));
LPCSTR win_str = narrow_str.c_str();
你可以通过另一种方式轻松地给出一些'narrowstr':
std::wstring wide_str(StringToWString(narrowstr));
LPWCSTR win_wstr = wide_str.c_str();
显然,这样做效率不高,因为你要分配一个本地然后通过堆栈将其复制回来(我通过使用构造函数初始化而不是赋值来缓解这一点......一些编译器优化了额外的副本,方式)。
如果可能,最好使用UNICODE宏来使用适当版本的Windows API(请参阅http://msdn.microsoft.com/en-us/library/ff381407%28v=vs.85%29.aspx - 使用字符串(Windows))。
但是,假设出于兼容性原因无法做到这一点,它确实可以帮助您了解需要发生的事情。
答案 1 :(得分:1)
编辑:完全误读了这个问题所以忽略我之前的回答,对不起。如果您需要稍后将此字符串传递给Windows API,您是否有理由使用std :: string而不是std :: wstring?
补充编辑:我这里有些困惑。 existsingstr的类型是什么,以及您正在调用的Windows API函数的签名是什么?我认为这有助于澄清问题。如果existingstr是std :: string,则.cstr()与LPCSTR兼容(即char const *)。如果existingstr是std :: wstring,则不是。 API是采用LPCSTR还是LPCWSTR?
你可以改用它:
private: std::wstring toss(System::String^ s)
{
std::wstring result;
{
pin_ptr<wchar_t const> ptr = PtrToStringChars(s);
result = ptr;
}
return result;
}
std :: wstring上的.c_str()将导致wchar_t const *(即LPCWSTR)。
答案 2 :(得分:1)
鉴于existingstr.c_str()
导致Cannot convert from LPCWSTR to LPCSTR
,您必须使用已定义的UNICODE
进行编译。使用LPCWSTR
代替LPCSTR
作为您传递给Win API的参数:
LPCWSTR str = existingstr.c_str();
无论如何,CString有一些不错的转换器:
CStringA strA(existingstr.c_str());
您可以将strA
传递给任何想要LPCSTR
。
答案 3 :(得分:0)
看起来您正在使用基于LPCSTR
关键字的MFC。 MFC提供了几个转换宏/函数:
http://msdn.microsoft.com/en-us/library/87zae4a3%28v=vs.80%29.aspx
CA2W(s)
:将ascii字符串转换为宽字符串,例如CStringA
- &gt; CStringW
CW2A(s)
:将一个宽字符串转换为ascii字符串,例如CStringW
- &gt; CStringA
还有其他人。