LPTSTR
型をchar *
C++に変換する方法を知っている人はいますか?
8 に答える
Unicode かどうかによって表示されます。LPTSTR は、Unicode でない場合は char*、そうである場合は w_char* です。
ここでよりよく議論されました(読む価値のある受け入れられた回答)
コンパイラの Character Setting がUnicode Character Setに設定されている場合、LPTSTRはwchar_t*として解釈されます。その場合、Unicode からマルチバイト文字への変換が必要です。
(Visual Studio では、設定は Project Properties\Configuration Properties\General\Character Set にあります)
以下のサンプル コードは、アイデアを与える必要があります。
#include <windows.h>
/* string consisting of several Asian characters */
LPTSTR wcsString = L"\u9580\u961c\u9640\u963f\u963b\u9644";
//LPTSTR wcsString = L"OnlyAsciiCharacters";
char* encode(const wchar_t* wstr, unsigned int codePage)
{
int sizeNeeded = WideCharToMultiByte(codePage, 0, wstr, -1, NULL, 0, NULL, NULL);
char* encodedStr = new char[sizeNeeded];
WideCharToMultiByte(codePage, 0, wstr, -1, encodedStr, sizeNeeded, NULL, NULL);
return encodedStr;
}
wchar_t* decode(const char* encodedStr, unsigned int codePage)
{
int sizeNeeded = MultiByteToWideChar(codePage, 0, encodedStr, -1, NULL, 0);
wchar_t* decodedStr = new wchar_t[sizeNeeded ];
MultiByteToWideChar(codePage, 0, encodedStr, -1, decodedStr, sizeNeeded );
return decodedStr;
}
int main(int argc, char* argv[])
{
char* str = encode(wcsString, CP_UTF8); //UTF-8 encoding
wchar_t* wstr = decode(str, CP_UTF8);
//If the wcsString is UTF-8 encodable, then this comparison will result to true.
//(As i remember some of the Chinese dialects cannot be UTF-8 encoded
bool ok = memcmp(wstr, wcsString, sizeof(wchar_t) * wcslen(wcsString)) == 0;
delete str;
delete wstr;
str = encode(wcsString, 20127); //US-ASCII (7-bit) encoding
wstr = decode(str, 20127);
//If there were non-ascii characters existing on wcsString,
//we cannot return back, since some of the data is lost
ok = memcmp(wstr, wcsString, sizeof(wchar_t) * wcslen(wcsString)) == 0;
delete str;
delete wstr;
}
一方、コンパイラの文字設定がマルチバイトに設定されている場合、LPTSTRはchar*として解釈されます。
その場合:
LPTSTR x = "test";
char* y;
y = x;
以下も参照してください。
wchar_t 変換に関する別の議論: WideCharToMultiByte を適切に使用する方法
MSDN 記事: http://msdn.microsoft.com/en-us/library/dd374130(v=vs.85).aspx
有効なコード ページ識別子: http:// msdn.microsoft.com/en-us/library/dd317756(v=vs.85).aspx
これを行うには多くの方法があります。MFC または ATL の CString、ATL マクロ、または Win32 API。
LPTSTR szString = _T("Testing");
char* pBuffer;
ATL マクロを使用して、以下を変換できます。
USES_CONVERSION;
pBuffer = T2A(szString);
C文字列:
CStringA cstrText(szString);
または Win32 APIが定義されているWideCharToMultiByte
場合。UNICODE
char * pCopy = NULL;
if (sizeof(TCHAR) == sizeof(char))
{
size_t size = strlen(pOriginal);
pCopy = new char[size + 1];
strcpy(pCopy, pOriginal);
}
else
{
size_t size = wcstombs(NULL, pOriginal, 0);
pCopy = new char[size + 1];
wcstombs(pCopy, pOriginal, size + 1);
}
簡単な例が欠けていたので、次のとおりです。
(私にとって char* は char[] と同じです)
LPCTSTR myLPCTSTR = getLPCTSTR();
TCHAR myT[500];
wcscpy(myT,myLPCTSTR);
char myC[500];
sprintf(myC, "%S", myT);
その方法を理解するのに時間がかかったので、これが誰かの役に立てば幸いです。
まず、LPTSTR
はポインタ型であり、基本的に同等ですTCHAR*
(含まれていると仮定<tchar.h>
)。のサイズはTCHAR
、文字エンコーディング タイプによって異なります。つまり、ユニコードが定義されている場合TCHAR
は に等しくwchar_t
、それ以外の場合はchar
です。
当然、ワイド文字を通常の に変換するchar
と、LSB しか保持できず、一部のデータが失われる可能性があります。これは私にとってどういうわけか苛立たしいものでした。だから私は次のコードを書きました。その主な利点は、データを失うことなく変換を行うことです。
ちなみに、データの損失に問題がない場合wcstombs
は、仕事をします.
#include <cstring>
#include <algorithm>
#include <tchar.h>
void lptstr2str(LPTSTR tch, char* &pch) // or (TCHAR* tch, char* &pch)
{
#ifndef UNICODE
std::memcpy(pch, tch, strlen(tch) + 1);
#else
size_t n =
sizeof(TCHAR) / sizeof(char)* wcsnlen(tch, std::string::npos);
pch = new char[n + 1];
std::memcpy(pch, tch, n + 1);
int len = n - std::count(pch, pch + n, NULL);
std::remove(pch, pch + n, NULL);
pch[len] = NULL;
#endif
}