CString output ;
const WCHAR* wc = L"Hellow World" ;
if(wc != NULL)
{
output.Append(wc);
}
printf("output: %s\n",output.GetBuffer(0));
Respuesta
también puede probar esto:
#include <comdef.h> // you will need this
const WCHAR* wc = L"Hello World" ;
_bstr_t b(wc);
const char* c = b;
printf("Output: %s\n", c);
_bstr_t
implementos siguientes operadores de conversión, que me parece muy útil:
operator const wchar_t*() const throw();
operator wchar_t*() const throw();
operator const char*() const;
operator char*() const;
EDIT: aclaración con respecto a los comentarios de respuesta: la línea const char* c = b;
da como resultado una copia de carácter estrecha de la cadena creada y administrada por la instancia _bstr_t
que la liberará una vez cuando se destruya. El operador simplemente devuelve un puntero a esta copia. Por lo tanto, no hay necesidad de copiar esta cadena. Además, en la pregunta, CString::GetBuffer
devuelve LPTSTR
(es decir, TCHAR*
) y noLPCTSTR
(es decir, const TCHAR*
).
Otra opción es el uso de macros de conversión:
USES_CONVERSION;
const WCHAR* wc = L"Hello World" ;
const char* c = W2A(wc);
El problema con este enfoque es que la memoria de cadena convertida se asigna en la pila, por lo que la longitud de la cadena es limitado. Sin embargo, esta familia de macros de conversión le permite seleccionar la página de códigos que se utilizará para la conversión, que a menudo se necesita si la cadena ancha contiene caracteres que no son ANSI.
Estoy tan tentado de hacer +1 de esto. '_bstr_t' y' _variant_t' solían ser mis mejores amigos en los días en que realmente necesitabas que ATL hiciera un componente COM decente en C++ – sehe
pero no copió wc en c – jack
¿por qué iba a copiarlo? su código muestra que necesita usarlo en 'printf'. '_bstr_t' se ocupará de liberar la memoria.Si necesita conservar una copia y enviar la cadena, use la instancia '_bstr_t', no' const char * '- en este sentido,' _bstr_t' es similar a 'CString'. Se encarga de copiar los datos de cadena correctamente cuando se utilizan varias copias del objeto (aunque no utiliza * copy-on-write *). –
Se podría hacer esto, o se podría hacer algo más limpio:
std::wcout << L"output: " << output.GetString() << std::endl;
Es bastante fácil, porque CString
es sólo un typedef para CStringT
, y también tiene acceso a CStringA
y CStringW
(usted debe leer la documentación acerca de las diferencias).
CStringW myString = L"Hello World";
CString myConvertedString = myString;
'CStringA myConvertedString (L "Hello World");' también funciona – Rost
Sí, me doy cuenta de eso, pero estaba escrito que manera de estar más cerca de su código de ejemplo. –
¿Qué hace esta conversión con caracteres anchos que no tienen un carácter angosto coincidente? –
Se puede utilizar para este propósito sprintf
:
const char output[256];
const WCHAR* wc = L"Hellow World" ;
sprintf(output, "%ws", wc);
No creo que puedas declarar 'output' como' const' – CinCout
Mi código para Linux
// Debian GNU/Linux 8 "Jessie" (amd64)
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
// Use wcstombs(3) to convert Unicode-string (wchar_t *) to UTF-8 (char *)
// http://man7.org/linux/man-pages/man3/wcstombs.3.html
int f(const wchar_t *wcs) {
setlocale(LC_ALL,"ru_RU.UTF-8");
printf("Sizeof wchar_t: %d\n", sizeof(wchar_t));
// on Windows, UTF-16 is internal Unicode encoding (UCS2 before WinXP)
// on Linux, UCS4 is internal Unicode encoding
for (int i = 0; wcs[i] > 0; i++) printf("%2d %08X\n",i,wcs[i]);
char s[256];
size_t len = wcstombs(s,wcs,sizeof(s));
if (len > 0) {
s[len] = '\0';
printf("mbs: %s\n",s);
for (int i = 0; i < len; i++)
printf("%2d %02X\n",i,(unsigned char)s[i]);
printf("Size of mbs, in bytes: %d\n",len);
return 0;
}
else return -1;
}
int main() {
f(L"Привет"); // 6 symbols
return 0;
}
¿Cómo construir
#!/bin/sh
NAME=`basename $0 .sh`
CC=/usr/bin/g++-4.9
INCS="-I."
LIBS="-L."
$CC ${NAME}.c -o _${NAME} $INCS $LIBS
salida
$ ./_test
Sizeof wchar_t: 4
0 0000041F
1 00000440
2 00000438
3 00000432
4 00000435
5 00000442
mbs: Привет
0 D0
1 9F
2 D1
3 80
4 D0
5 B8
6 D0
7 B2
8 D0
9 B5
10 D1
11 82
Size of mbs, in bytes: 12
- 1. Cómo convertir wchar_t * a const char *
- 2. C++ convertir char a const char *
- 3. Cómo convertir std :: string a const char *?
- 4. Convertir CString en const char *
- 5. Cómo convertir 'const boost :: filesystem2 :: path' en 'const char *'?
- 6. Corrección de const: const char const * const GetName const (// stuff);
- 7. const char * a const std :: string &
- 8. const char * miVar vs const char miVar []
- 9. convertido BSTR a const char *
- 10. Double to Const Char *
- 11. ¿Por qué no puedo convertir 'char **' a 'const char * const *' en C?
- 12. Const const char * string a NSString con longitud Y codificación
- 13. convertir const char * a NSString * y convertir de nuevo - _NSAutoreleaseNoPool()
- 14. Diferencia entre static const char * y const char *
- 15. C++ de unsigned char * a const char *
- 16. Conversión implícita de char ** a const char **
- 17. C++: Significado de const char * const *
- 18. Convertir char * a * WCHAR en C
- 19. Diferencia entre const char * p y const char * p
- 20. inicialización const char *
- 21. const char * concatenación
- 22. convertir std :: wstring a const * char en C++
- 23. ¿Cómo se convierte LPCWSTR a const char *?
- 24. cómo pasar el vector de cadena a foo (char const * const * const)?
- 25. Destructor en const char *
- 26. Python a C/C++ const char pregunta
- 27. nsstring y const char * conversión
- 28. no se puede convertir 'LPCWSTR {aka const wchar_t *}' a 'LPCSTR {aka const char *}
- 29. Cómo crear una matriz de static const const char *
- 30. cómo convertir el valor de uint64_t en cadena const char?
Agregue una explicación, como código puro, no dice mucho. – Kao
No necesita GetBuffer. CString tiene un operador LPCTSTR que accede al búfer interno. – MikMik
¿cuál debería ser la salida si 'wc' es' привет мир'? ¿te importan las páginas de códigos o esta es solo una conversión amplia -> estrecha con todos los caracteres anchos siendo caracteres ANSI? –