将lptstr转换为char *

时间:2008-12-05 02:52:26

标签: c++ char lptstr

有人会碰巧知道如何在C ++中将LPTSTR类型转换为char *吗?

8 个答案:

答案 0 :(得分:11)

取决于是否为Unicode,它会出现。如果不是Unicode,则LPTSTR为char *,如果不是,则为w_char *。

Discussed better here(接受的答案值得一读)

答案 1 :(得分:7)

有很多方法可以做到这一点。 MFC或ATL的CString,ATL宏或Win32 API。

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

您可以使用ATL宏进行转换:

USES_CONVERSION;
pBuffer = T2A(szString);

CString的:

CStringA cstrText(szString);
如果定义了WideCharToMultiByte,则

或Win32 API UNICODE

答案 2 :(得分:6)

如果编译器字符设置设置为 Unicode字符集,则 LPTSTR 将被解释为 wchar_t * 。在这种情况下,需要Unicode到多字节的字符转换 (在Visual Studio中,设置位于项目属性\配置属性\常规\字符集)

下面的示例代码应该提供一个想法:

#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转换的另一个讨论:How do you properly use 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

答案 3 :(得分:3)

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);
}

答案 4 :(得分:0)

好的,让我们说你必须使用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

任何问题只是问。我意识到这是一篇很老的帖子 - 但是我喜欢为那些期待的人们发帖。 (像我这样的人)

答案 5 :(得分:0)

我希望这对某人有所帮助,因为我花了一段时间才弄清楚如何去做。

首先,LPTSTR是指针类型,它基本上等同于TCHAR*(假设包含<tchar.h>)。 请注意,TCHAR的大小因字符编码类型而异。即如果定义了unicode,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
}

答案 6 :(得分:0)

我错过了一些简单的例子,所以这里是:

(对我来说char *与char []相同)

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

答案 7 :(得分:-1)

毫无疑问,许多人(例如,我们的unix民谣)会惊恐地反省疯子帽子Microserf doublespeak - “如果您的编译器处于Unicode模式,使用LPWSTR或在其前面粘贴”T_“,但仅限于它是一个静态字符串,与“L”相同,或者如果使用ATL则使用T2A(),但现在已经过时,或者使用VARIANT但是如果与COM / OLE链接则没有“......”。

此页面上列出的“if(sizeof(TCHAR)== sizeof(char))”是一个很好的解决方案的逻辑尝试,但它不会编译 - if-true将无法编译或者-false不会'编译,取决于你的编译器标志(Aaargh!)。 对于一个可写入的便携式解决方案,您需要求助于[太通用的命名] UNICODE宏。我提供了以前代码的改编:

string mfc_to_zstring (CString &sref)
{
    char nojoy[65536];
    char *ptr, *psin = NULL;
    string sot;
    LPCTSTR p = sref;


#if UNICODE
    if (sizeof(TCHAR) != sizeof(char))
    {
        size_t n = wcstombs(NULL, p, 0);
        if (n > 65530)
        {
            psin = new char[n + 1];
            wcstombs(psin, p, n + 1);
            ptr = psin;
        }
        else
        {
            wcstombs(nojoy, p, n + 1);
            ptr = nojoy;
        }

        sot = ptr;
        if (psin != NULL)
            delete psin;
    }
    else
        { std::cerr << "Aaargh! Microsoft horror.\n"; exit(1); }
#else
    if (sizeof(TCHAR) == sizeof(char))
    {
        const char *ptr = p;
        sot = ptr;
    }
    else
      { std::cerr << "Aaargh! You should never see this line\n"; exit(1); }
#endif

    return sot;
}