Bagaimana cara mengubah a std::string
menjadi LPCSTR
? Juga, bagaimana cara mengonversi a std::string
menjadi LPWSTR
?
Saya benar-benar bingung dengan ini LPCSTR
LPSTR
LPWSTR
dan LPCWSTR
.
Apakah LPWSTR
dan LPCWSTR
sama?
str.c_str()
memberi Anda a const char *
, yang merupakan LPCSTR
(Long Pointer ke Constant STRing) - artinya pointer ke 0
string karakter yang diakhiri. W
Berarti string lebar (terdiri dari wchar_t
sebagai pengganti char
).
Panggilan
c_str()
untuk mendapatkanconst char *
(LPCSTR
) dari astd::string
.Semuanya atas nama:
LPSTR
- (panjang) penunjuk ke string -char *
LPCSTR
- (panjang) penunjuk ke string konstan -const char *
LPWSTR
- Penunjuk (panjang) ke string Unicode (lebar) -wchar_t *
LPCWSTR
- Penunjuk (panjang) ke string Unicode (lebar) konstan -const wchar_t *
LPTSTR
- (panjang) pointer ke TCHAR (Unicode jika UNICODE didefinisikan, ANSI jika tidak) string -TCHAR *
LPCTSTR
- (panjang) penunjuk ke string TCHAR konstan -const TCHAR *
Anda dapat mengabaikan bagian L (panjang) dari nama - itu peninggalan dari Windows 16-bit.
sumber
Ini adalah typedef yang ditentukan Microsoft yang sesuai dengan:
LPCSTR: penunjuk ke string const diakhiri null dari
char
LPSTR: penunjuk ke string karakter yang diakhiri null dari
char
(seringkali buffer dilewatkan dan digunakan sebagai parameter 'keluaran')LPCWSTR: penunjuk ke null yang diakhiri string dari const
wchar_t
LPWSTR: pointer ke null diakhiri string
wchar_t
(seringkali buffer dilewatkan dan digunakan sebagai parameter 'keluaran')Untuk "mengubah" a
std::string
ke LPCSTR tergantung pada konteks yang tepat tetapi biasanya panggilan.c_str()
sudah cukup.Ini bekerja.
Perhatikan bahwa Anda tidak boleh mencoba melakukan sesuatu seperti ini.
Buffer yang dikembalikan oleh
.c_str()
dimiliki olehstd::string
instance dan hanya akan valid sampai string selanjutnya diubah atau dihancurkan.Untuk mengubah a
std::string
menjadi aLPWSTR
lebih rumit. Menginginkan anLPWSTR
menyiratkan bahwa Anda memerlukan buffer yang dapat dimodifikasi dan Anda juga perlu memastikan bahwa Anda memahami pengkodean karakter apa yangstd::string
digunakan. Jikastd::string
berisi string menggunakan pengkodean default sistem (dengan asumsi windows, di sini), maka Anda dapat menemukan panjang buffer karakter lebar yang diperlukan dan melakukan transcoding menggunakanMultiByteToWideChar
(fungsi Win32 API).misalnya
sumber
Menggunakan
LPWSTR
Anda dapat mengubah konten string yang menunjuknya. MenggunakanLPCWSTR
Anda tidak dapat mengubah konten string yang menunjuknya.LPWSTR
hanyalah penunjuk ke string asli. Anda tidak boleh mengembalikannya dari fungsi menggunakan contoh di atas. Agar tidak bersifat sementara,LPWSTR
Anda harus membuat salinan string asli di heap. Periksa contoh di bawah ini:sumber
The
MultiByteToWideChar
jawaban yang Charles Bailey memberi adalah yang benar. KarenaLPCWSTR
hanya typedef untukconst WCHAR*
,widestr
dalam kode contoh ada dapat digunakan dimanapun yangLPWSTR
diharapkan atau yangLPCWSTR
diharapkan.Satu
std::vector<WCHAR>
perubahan kecil akan digunakan sebagai pengganti array yang dikelola secara manual:Juga, jika Anda perlu untuk bekerja dengan string lebar untuk memulainya, Anda dapat menggunakan
std::wstring
bukanstd::string
. Jika Anda ingin bekerja denganTCHAR
tipe Windows , Anda dapat menggunakanstd::basic_string<TCHAR>
. Mengubah daristd::wstring
menjadiLPCWSTR
atau daristd::basic_string<TCHAR>
menjadiLPCTSTR
hanyalah masalah panggilanc_str
. Saat Anda mengubah antara karakter ANSI dan UTF-16 yangMultiByteToWideChar
(dan kebalikannyaWideCharToMultiByte
) muncul di gambar.sumber
Konversinya sederhana:
std :: string str; LPCSTR lpcstr = str.c_str ();
sumber
Mengonversi itu sederhana:
Satu hal yang harus diperhatikan di sini adalah bahwa c_str tidak mengembalikan salinan myString, tetapi hanya penunjuk ke string karakter yang dibungkus std :: string. Jika Anda ingin / membutuhkan salinan, Anda harus membuatnya sendiri menggunakan strcpy.
sumber
Cara termudah untuk mengubah a
std::string
menjadi aLPWSTR
menurut saya:std::string
menjadistd::vector<wchar_t>
wchar_t
di vektor.std::vector<wchar_t>
memiliki ctor template yang akan mengambil dua iterator, seperti thestd::string.begin()
dan.end()
iterators. Ini akan mengubah setiap karakter menjadi awchar_t
. Itu hanya valid jikastd::string
berisi ASCII atau Latin-1, karena cara nilai Unicode mirip dengan nilai Latin-1. Jika berisi CP1252 atau karakter dari pengkodean lain, ini lebih rumit. Anda kemudian harus mengonversi karakter.sumber
std::wstring
?myString adalah string input dan lpSTR adalah setara dengan LPSTR .
sumber