Jak mogę przekonwertować plik std::string
na LPCSTR
? Jak mogę przekonwertować plik std::string
na LPWSTR
?
Jestem całkowicie zdezorientowany z tymi LPCSTR
LPSTR
LPWSTR
i LPCWSTR
.
Czy LPWSTR
i LPCWSTR
to samo?
str.c_str()
daje const char *
, czyli LPCSTR
(Long Pointer to Constant STRing) - oznacza, że jest to wskaźnik do 0
zakończonego ciągu znaków. W
oznacza szeroki ciąg (złożony z wchar_t
zamiast char
).
Zadzwoń,
c_str()
aby uzyskaćconst char *
(LPCSTR
) zstd::string
.Wszystko w nazwie:
LPSTR
- (długi) wskaźnik do łańcucha -char *
LPCSTR
- (długi) wskaźnik do stałego ciągu -const char *
LPWSTR
- (długi) wskaźnik do łańcucha Unicode (szeroki) -wchar_t *
LPCWSTR
- (długi) wskaźnik do stałego (szerokiego) łańcucha Unicode -const wchar_t *
LPTSTR
- (długi) wskaźnik do TCHAR (Unicode, jeśli zdefiniowano UNICODE, ANSI, jeśli nie) string -TCHAR *
LPCTSTR
- (długi) wskaźnik do stałego ciągu TCHAR -const TCHAR *
Możesz zignorować L (długą) część nazw - jest to pozostałość po 16-bitowym systemie Windows.
źródło
Są to zdefiniowane przez Microsoft czcionki, które odpowiadają:
LPCSTR: wskaźnik do zakończonego znakiem null łańcucha const
char
LPSTR: wskaźnik do łańcucha znaków zakończonego znakiem null
char
(często jest przekazywany bufor i używany jako parametr wyjściowy '')LPCWSTR: wskaźnik do zakończonego znakiem null łańcucha stałej
wchar_t
LPWSTR: wskaźnik do łańcucha zakończonego znakiem null
wchar_t
(często bufor jest przekazywany i używany jako parametr `` wyjściowy '')Konwersja a
std::string
na LPCSTR zależy od dokładnego kontekstu, ale zwykle wywołanie.c_str()
jest wystarczające.To działa.
Pamiętaj, że nie powinieneś próbować robić czegoś takiego.
Bufor zwrócony przez
.c_str()
jest własnościąstd::string
instancji i będzie ważny tylko do następnej modyfikacji lub zniszczenia ciągu.Konwersja a
std::string
na aLPWSTR
jest bardziej skomplikowana. ChcącychLPWSTR
oznacza, że trzeba modyfikowalna bufor i trzeba także mieć pewność, że wiesz, co postać kodowaniastd::string
korzysta. Jeślistd::string
zawiera ciąg znaków przy użyciu domyślnego kodowania systemu (zakładając, że okna są tutaj), wówczas można znaleźć długość wymaganego bufora szerokich znaków i przeprowadzić transkodowanie za pomocąMultiByteToWideChar
(funkcji Win32 API).na przykład
źródło
Za pomocą
LPWSTR
można zmienić zawartość ciągu, w którym wskazuje. UżywanieLPCWSTR
you nie mogło zmienić zawartości łańcucha, w którym wskazuje.LPWSTR
jest tylko wskaźnikiem do oryginalnego ciągu. Nie powinieneś zwracać go z funkcji przy użyciu powyższego przykładu. Aby nie był tymczasowyLPWSTR
, powinieneś zrobić kopię oryginalnego ciągu na stercie. Sprawdź próbkę poniżej:źródło
MultiByteToWideChar
Odpowiedź, że Charles Bailey dał jest prawidłowa. PonieważLPCWSTR
jest to po prostu typedef forconst WCHAR*
,widestr
w przykładowym kodzie można go użyć wszędzie tam, gdzieLPWSTR
oczekiwano a lubLPCWSTR
oczekiwano.Jedną drobną poprawką byłoby użycie
std::vector<WCHAR>
zamiast ręcznie zarządzanej tablicy:Ponadto, jeśli na początku musisz pracować z szerokimi łańcuchami, możesz użyć
std::wstring
zamiaststd::string
. Jeśli chcesz pracować zTCHAR
typem Windows , możesz użyćstd::basic_string<TCHAR>
. Konwersja zstd::wstring
naLPCWSTR
lub zstd::basic_string<TCHAR>
naLPCTSTR
to tylko kwestia powołaniac_str
. Kiedy zmieniasz znaki ANSI i UTF-16, pojawia sięMultiByteToWideChar
(i odwrotnieWideCharToMultiByte
).źródło
Konwersja jest prosta:
std :: string str; LPCSTR lpcstr = str.c_str ();
źródło
Konwersja jest prosta:
Jedną rzeczą, na którą należy uważać, jest to, że c_str nie zwraca kopii myString, ale tylko wskaźnik do ciągu znaków, który zawija std :: string. Jeśli chcesz / potrzebujesz kopii, musisz zrobić ją samodzielnie za pomocą strcpy.
źródło
Moim zdaniem najłatwiejszym sposobem konwersji a
std::string
na aLPWSTR
jest:std::string
do Astd::vector<wchar_t>
wchar_t
w wektorze.std::vector<wchar_t>
ma obiekt sterujący na podstawie szablonu, który będzie wymagał dwóch iteratorów, takich jak iteratorystd::string.begin()
i.end()
. Spowoduje to jednak konwersję każdego znaku na znakwchar_t
. Jest to ważne tylko wtedy, gdystd::string
zawiera ASCII lub Latin-1, ze względu na sposób, w jaki wartości Unicode przypominają wartości Latin-1. Jeśli zawiera CP1252 lub znaki z innego kodowania, jest to bardziej skomplikowane. Będziesz wtedy musiał przekonwertować znaki.źródło
std::wstring
?myString jest ciągiem wejściowym, a lpSTR jest odpowiednikiem LPSTR .
źródło