2011-12-16 2 views

ответ

7

wchar_t строка состоит из 16-битных, LPSTR является указателем на строку октетов, определяется следующим образом:

typedef char* PSTR, *LPSTR; 

Что важно, что LPSTR может быть нулевым байтом ,

При переводе с wchar_t на номер LPSTR вам необходимо принять решение о кодировке. После этого вы можете использовать функцию WideCharToMultiByte для выполнения преобразования.

Например, вот как перевести широкоэкранный строку символов в UTF8, используя STL строки, чтобы упростить управление памятью:

#include <windows.h> 
#include <string> 
#include <vector> 

static string utf16ToUTF8(const wstring &s) 
{ 
    const int size = ::WideCharToMultiByte(CP_UTF8, 0, s.c_str(), -1, NULL, 0, 0, NULL); 

    vector<char> buf(size); 
    ::WideCharToMultiByte(CP_UTF8, 0, s.c_str(), -1, &buf[0], size, 0, NULL); 

    return string(&buf[0]); 
} 

Вы можете использовать эту функцию, чтобы переведите wchar_t* в LPSTR так:

const wchar_t *str = L"Hello, World!"; 
std::string utf8String = utf16ToUTF8(str); 
LPSTR lpStr = utf8String.c_str(); 
+1

Следует отметить, что 16 бит специфичны для окон, а другая реализация может (и будет) иметь разные размеры для wchar_t и/или char. – PlasmaHH

+0

спасибо, а для преобразования LPSTR в wstring, как я могу это сделать? – nidhal

+0

@PlasmaHH: Да, это правда - я строго говорил с Windows в виду (поскольку он был помечен как visual-C++). –

0

Я использую это

wstring mywstr(somewstring); 
string mycstr(mywstr.begin(), mywstr.end()); 

затем использовать его в качестве mycstr.c_str()

(редактировать, так как я не могу комментировать) это, как я использовал это, и она отлично работает:

#include <string> 

std::wstring mywstr(ffd.cFileName); 
std::string mycstr(mywstr.begin(), mywstr.end()); 
pRequest->Write(mycstr.c_str()); 
+1

и каковы эти функции? –

Смежные вопросы