2009-07-29 230 views

回答

91

str.c_str()给你一个const char *,这是一个LPCSTR(长指针,常量字符串) - 意味着它是一个指向字符的0结尾的字符串。 W表示宽字符串(由wchar_t组成,而不是char)。

+5

次要挑剔:在x64上LPCSTR将是一个64位指针,指向一个(常量)以null结尾的字符串。 – Joel 2009-07-30 14:41:33

2

转换很简单:

std :: string str; LPCSTR lpcstr = str.c_str();

138

致电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的延期。

32

这些是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; 
} 
3

转换很简单:

std::string myString; 

LPCSTR lpMyString = myString.c_str(); 

有一件事要小心这里是c_str不返回MyString的副本,而只是一个指针,它指向的std字符串:: string的包裹。如果你想/需要一个副本,你需要使用strcpy自己创建一个。

+0

如何将std :: String转换为LPWSTR ??? – Cute 2009-07-29 13:44:10

1

std::string转换为LPWSTR最简单的方法是在我看来:

  1. 转换的std::stringstd::vector<wchar_t>
  2. 拍摄第一wchar_t的地址向量。

std::vector<wchar_t>具有模板构造函数将带两个迭代,如std::string.begin().end()迭代器。不过,这会将每个字符转换为wchar_t。这只有在std::string包含ASCII或Latin-1时才有效,因为Unicode值与Latin-1值相似。如果它包含CP1252或来自任何其他编码的字符,则会更复杂。然后你需要转换字符。

14

使用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 
} 
4

查尔斯贝利给出的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::wstringLPCWSTRstd::basic_string<TCHAR>LPCTSTR只需要调用c_str的问题。当你认为MultiByteToWideChar(及其逆WideCharToMultiByte)到图片ANSI和UTF-16字符之间改变它。

相关问题