如何将std::string
转换为LPCSTR
?另外,如何将std::string
转换为LPWSTR
?如何将std :: string转换为LPCSTR?
我完全同意这些LPCSTR
LPSTR
LPWSTR
和LPCWSTR
。
是LPWSTR
和LPCWSTR
是一样的吗?
如何将std::string
转换为LPCSTR
?另外,如何将std::string
转换为LPWSTR
?如何将std :: string转换为LPCSTR?
我完全同意这些LPCSTR
LPSTR
LPWSTR
和LPCWSTR
。
是LPWSTR
和LPCWSTR
是一样的吗?
str.c_str()
给你一个const char *
,这是一个LPCSTR
(长指针,常量字符串) - 意味着它是一个指向字符的0
结尾的字符串。 W
表示宽字符串(由wchar_t
组成,而不是char
)。
转换很简单:
std :: string str; LPCSTR lpcstr = str.c_str();
致电c_str()
从std::string
得到const char *
(LPCSTR
)。
这一切都在名称:
LPSTR
- (长)指向字符串 - char *
LPCSTR
- (长)指针常量字符串 - const char *
LPWSTR
- (长)指针Unicode(wide)string - wchar_t *
LPCWSTR
- (long)指向常量Unicode的指针(宽)串 - const wchar_t *
LPTSTR
- (长)指向TCHAR(Unicode的,如果UNICODE被定义,ANSI如果不)字符串 - TCHAR *
LPCTSTR
- (长)指针常量TCHAR串 - const TCHAR *
你可以忽略名称中的长(L)部分 - 这是16位Windows的延期。
这些是Microsoft定义的typedef其对应于:
LPCSTR:指针为空char
LPSTR的终止常量字符串:指针为null的char
终止字符串(通常是一个缓冲器被传递,并且用作一个 '输出' PARAM)
LPCWSTR:指针为空常量wchar_t
LPWSTR的终止的字符串:指针为null吨的wchar_t
erminated串(通常是一个缓冲器被传递并用作“输出” PARAM)
“转换”一个std::string
到LPCSTR取决于确切的上下文,但通常主叫.c_str()
是足够的。
This Works。
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
请注意,您不应该尝试这样做。
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
通过.c_str()
返回的缓冲区由std::string
实例拥有的,只会是有效的,直到串下一个修改或破坏。
要将std::string
转换为LPWSTR
会更复杂。想要LPWSTR
意味着您需要一个可修改的缓冲区,并且您还需要确保您了解字符编码std::string
正在使用什么。如果std::string
包含一个使用系统默认编码的字符串(假设这里是windows),那么您可以找到所需的宽字符缓冲区的长度,并使用MultiByteToWideChar
(Win32 API函数)执行转码。
例如
void f(const std:string& instr)
{
// Assumes std::string is encoded in the current Windows ANSI codepage
int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), NULL, 0);
if (bufferlen == 0)
{
// Something went wrong. Perhaps, check GetLastError() and log.
return;
}
// Allocate new LPWSTR - must deallocate it later
LPWSTR widestr = new WCHAR[bufferlen + 1];
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), widestr, bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// Do something with widestr
delete[] widestr;
}
转换很简单:
std::string myString;
LPCSTR lpMyString = myString.c_str();
有一件事要小心这里是c_str不返回MyString的副本,而只是一个指针,它指向的std字符串:: string的包裹。如果你想/需要一个副本,你需要使用strcpy自己创建一个。
如何将std :: String转换为LPWSTR ??? – Cute 2009-07-29 13:44:10
到std::string
转换为LPWSTR
最简单的方法是在我看来:
std::string
到std::vector<wchar_t>
wchar_t
的地址向量。std::vector<wchar_t>
具有模板构造函数将带两个迭代,如std::string.begin()
和.end()
迭代器。不过,这会将每个字符转换为wchar_t
。这只有在std::string
包含ASCII或Latin-1时才有效,因为Unicode值与Latin-1值相似。如果它包含CP1252或来自任何其他编码的字符,则会更复杂。然后你需要转换字符。
使用LPWSTR
你可以改变字符串的内容,它指向的。使用LPCWSTR
您无法更改它指向的字符串内容。
std::string s = SOME_STRING;
// get temporary LPSTR (not really safe)
LPSTR pst = &s[0];
// get temporary LPCSTR (pretty safe)
LPCSTR pcstr = s.c_str();
// convert to std::wstring
std::wstring ws;
ws.assign(s.begin(), s.end());
// get temporary LPWSTR (not really safe)
LPWSTR pwst = &ws[0];
// get temporary LPCWSTR (pretty safe)
LPCWSTR pcwstr = ws.c_str();
LPWSTR
只是一个指向原始字符串的指针。你不应该使用上面的示例将它从函数中返回。为了得到不临时LPWSTR
你应该做在堆上原始字符串的副本。检查下面的示例:
LPWSTR ConvertToLPWSTR(const std::string& s)
{
LPWSTR ws = new wchar_t[s.size()+1]; // +1 for zero at the end
copy(s.begin(), s.end(), ws);
ws[s.size()] = 0; // zero at the end
return ws;
}
void f()
{
std::string s = SOME_STRING;
LPWSTR ws = ConvertToLPWSTR(s);
// some actions
delete[] ws; // caller responsible for deletion
}
查尔斯贝利给出的MultiByteToWideChar
答案是正确的。因为LPCWSTR
仅仅是const WCHAR*
,widestr
在示例代码可以使用一个typedef只要一个LPWSTR
预计或其中LPCWSTR
预期。
一个小调整是使用std::vector<WCHAR>
代替人工管理的阵列:
// using vector, buffer is deallocated when function ends
std::vector<WCHAR> widestr(bufferlen + 1);
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), &widestr[0], bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// no need to delete; handled by vector
另外,如果你需要宽字符串工作,开始时,你可以使用std::wstring
而不是std::string
。如果你想使用Windows TCHAR
类型的工作,你可以使用std::basic_string<TCHAR>
。从转换到std::wstring
或LPCWSTR
从std::basic_string<TCHAR>
到LPCTSTR
只需要调用c_str
的问题。当你认为MultiByteToWideChar
(及其逆WideCharToMultiByte
)到图片ANSI和UTF-16字符之间改变它。
次要挑剔:在x64上LPCSTR将是一个64位指针,指向一个(常量)以null结尾的字符串。 – Joel 2009-07-30 14:41:33