¿Alguien sabe cómo convertir el tipo LPTSTR
en char *
en C++?Convierta lptstr en char *
Respuesta
Depende si es Unicode o no aparece. LPTSTR es char * si no Unicode, o w_char * si es así.
Discussed better here (respuesta aceptada vale la pena leer)
Aquí hay muchas maneras de hacerlo. CString de MFC o ATL, macros ATL o API de Win32.
LPTSTR szString = _T("Testing");
char* pBuffer;
Puede utilizar macros para convertir ATL:
USES_CONVERSION;
pBuffer = T2A(szString);
CString:
CStringA cstrText(szString);
o la API de Win32 WideCharToMultiByte
si UNICODE
se define.
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);
}
Si uso de esta manera, obtengo este error C2664: 'strlen': no se puede convertir el parámetro 1 de 'LPTSTR' a 'const char *' –
Si su compilador Carácter El ajuste se establece en Unicode juego de caracteres, entonces LPTSTR será interpretado como wchar_t *. En ese caso, se requiere la conversión de caracteres de Unicode a Multibyte.
(En Visual Studio, el establecimiento se encuentra en Propiedades del proyecto \ Propiedades de configuración \ general \ juego de caracteres)
El código de ejemplo siguiente debe darle una idea:
#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;
}
Por otro lado, si su La configuración de caracteres del compilador está configurada en Multibyte, luego LPTSTR se interpretará como char *.
En ese caso:
LPTSTR x = "test";
char* y;
y = x;
Véase también:
Otra discusión acerca de la conversión wchar_t: How do you properly use WideCharToMultiByte
MSDN artículo: http://msdn.microsoft.com/en-us/library/dd374130(v=vs.85).aspx
válidos identificadores de página de códigos: http://msdn.microsoft.com/en-us/library/dd317756(v=vs.85).aspx
sin duda muchos (por ejemplo, nosotros unix folk) retrocederán horrorizados ante el mad-hat ter Doble expresión de Microserf: "si su compilador está en modo Unicode, use LPWSTR o pegue un" T_ "frente a él, pero solo si es una cadena estática, que es lo mismo que una" L ", o use T2A() si usando ATL, pero que ahora está desactualizado, o usa VARIANT pero no si está enlazando con COM/OLE "...).
El "if (sizeof (TCHAR) == sizeof (char))" enumerado en esta página es un intento lógico de una buena solución, pero no se compilará, ya sea el if-true no compilará o if-false no compilará, dependiendo de las banderas del compilador (¡Aaargh!). Para una solución portátil de escritura y olvídate, deberá recurrir a la macro UNICODE [demasiado genérico].Ofrezco esta adaptación del código anterior:
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;
}
Bien, entonces digamos que TIENE que usar Unicode. Y usa algunas funciones como LookupAccountSid, que son necesarias para que su programa funcione, pero devuelven LPTSTR para obtener información importante que NECESITA procesar como cadena (por alguna razón, es programación, cosas así)
Ahora, si estuvieras usando multibyte, esto no sería un problema. Pero hay una manera de resolverlo. Este es mi método y es ciertamente descuidado. Pero, sin embargo, debería ser capaz de ver cómo funciona.
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
Cualquier pregunta simplemente pregunte. Me doy cuenta de que esta es una publicación anterior, pero me gusta publicar para las personas en el furture que vienen buscando. (personas como yo)
Espero que esto ayude a alguien, porque me llevó un tiempo descubrir cómo hacerlo.
En primer lugar, LPTSTR
es del tipo de puntero y es básicamente equivalente a TCHAR*
(suponiendo que se incluye <tchar.h>
). Tenga en cuenta que el tamaño de TCHAR
varía según el tipo de codificación de caracteres. es decir, si se define unicode, TCHAR
es igual a wchar_t
, de lo contrario es char
.
Naturalmente, si convierte un carácter ancho en uno normal char
, solo puede conservar el LSB y puede perder algunos datos. Esto fue de alguna manera irritante para mí. entonces escribí el siguiente código. Su principal ventaja es hacer la conversión sin perder ningún dato.
Por cierto, si está bien con la pérdida de datos, entonces wcstombs
hace el trabajo.
#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
}
me faltaba algún ejemplo sencillo lo que aquí está:
(para mí char * es idéntica a char [])
LPCTSTR myLPCTSTR = getLPCTSTR();
TCHAR myT[500];
wcscpy(myT,myLPCTSTR);
char myC[500];
sprintf(myC, "%S", myT);
- 1. Java: convierta un char [] a CharSequence
- 2. Convierta un 'System :: String ^' en 'const char *' en vC++
- 3. ¿Puedes lanzar un LPTSTR a un BSTR?
- 4. Analizando líneas de comando LPTSTR * args con boost :: program_options
- 5. char! = (Char firmado), char! = (Char no firmado)
- 6. Convierta de manera eficiente un corto sin signo en un char *
- 7. Convierta un vector <char> en una cadena con una conversión
- 8. C Convertir char en char *
- 9. Convierta java.util.Set en scala.collection.Set
- 10. Convierta polígonos en malla
- 11. Char Matriz VS Char *
- 12. Método String.Replace (char, char) en C#
- 13. Diferencia entre char * y char [] en C
- 14. char * foo vs char * foo
- 15. Convierta objeto en cadena JSON
- 16. Convierta NSString en número entero
- 17. Convierta la secuencia en operador
- 18. Convierta LPWSTR en la cadena
- 19. C - fundición int a char y anexar char a char
- 20. Destructor en const char *
- 21. Marshal "char *" en C#
- 22. Convertir Zval en char *
- 23. char imprimible en java
- 24. Convertir byte [] en char []
- 25. Convierta una matriz a HashSet <T> en .NET
- 26. char * vs char ** como parámetros a una función en C
- 27. ¿Es posible convertir char [] a char * en C?
- 28. casting char [] [] a char ** provoca segfault?
- 29. Asignación de memoria char * y char []
- 30. C++ - char ** argv vs char * argv []
por utilización de macros de conversión ATL es obsoleta (probablemente ese uso era válido para VC6 y ATL3, pero desde VC7 las cosas cambiaron). La macro 'T2A' con' USES_CONVERSION' está desaprobada. Es mejor usar ATL7 + [ayudantes de conversión] (http://msdn.microsoft.com/en-us/library/87zae4a3 (v = vs.80) .aspx) como 'CT2A' (sin' USES_CONVERSION'): 'CT2A ansiBuffer (szString); ' –