web-dev-qa-db-ja.com

lptstrをchar *に変換します

C++でタイプLPTSTRchar *に変換する方法を知っている人はいますか?

15
user37875

Unicodeかどうかによって異なります。 LPTSTRは、Unicodeでない場合はchar *、そうである場合はw_char *です。

ここでより良い議論 (読む価値のある受け入れられた回答)

11
JamesSugrue

これを行う方法はたくさんあります。 MFCまたはATLのCString、ATLマクロ、またはWin32API。

LPTSTR szString = _T("Testing");
char* pBuffer;

ATLマクロを使用して変換できます。

USES_CONVERSION;
pBuffer = T2A(szString);

CString:

CStringA cstrText(szString);

または、Win32 API WideCharToMultiByteUNICODEが定義されている場合)。

7
John Z

コンパイラの文字設定がUnicode文字セットに設定されている場合、[〜#〜] 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

7
vahapt
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);
}
3
Mark Ransom

では、Unicodeを使用する必要があるとしましょう。また、プログラムが機能するために必要なLookupAccountSidなどの関数を使用しますが、これらの関数は、文字列として処理する必要のある重要な情報に対してLPTSTRを返します(何らかの理由で、プログラミングであるため、このようなことが起こります)

さて、マルチバイトを使用している場合-これは問題ではありません。しかし、それを解決する方法があります。これは私の方法であり、確かにずさんです。しかし、それにもかかわらず、あなたはそれがどのように機能するかを見ることができるはずです。

const std::wstring &wstring = AcctName; // AcctName being my LPTSTR string
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstring[0], (int)wstring.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);

WideCharToMultiByte(CP_UTF8, 0, & wstring[0], (int)wstring[0], &strTo[0], size_needed, NULL, NULL);

char* charUserName = new char[strTo.size() + 1];

// Set charUserName via copying
std::copy(strTo.begin(), strTo.end(), charUserName);
charUserName[strTo.size()] = '\0';

SetUPI(charUserName); // charUserName being my converted char * - 
// You don't need this last part - but this is an example of passing to method
// that takes a string

どんな質問でもただ尋ねてください。これは古い投稿だと思いますが、将来的に探している人のために投稿したいと思います。 (私のような人)

0
maxtuzz

これが誰かに役立つことを願っています。方法を理解するのにしばらく時間がかかったからです。

まず、LPTSTRはポインター型であり、基本的にTCHAR*と同等です(<tchar.h>が含まれていると仮定)。 TCHARのサイズは、文字エンコードタイプによって異なることに注意してください。つまり、Unicodeが定義されている場合、TCHARwchar_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
}
0

私はいくつかの簡単な例を見逃していたので、ここにあります:

(私にとって、char *はchar []と同じです)

LPCTSTR myLPCTSTR = getLPCTSTR();
TCHAR myT[500];
wcscpy(myT,myLPCTSTR);
char myC[500];
sprintf(myC, "%S", myT);
0
Racky