CString output ;
const WCHAR* wc = L"Hellow World" ;
if(wc != NULL)
{
output.Append(wc);
}
printf("output: %s\n",output.GetBuffer(0));
risposta
si può anche provare questo:
#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
attrezzi seguendo gli operatori di conversione, che trovo abbastanza utile:
operator const wchar_t*() const throw();
operator wchar_t*() const throw();
operator const char*() const;
operator char*() const;
MODIFICA: chiarimento in merito ai commenti di risposta: la riga const char* c = b;
produce una copia a caratteri stretti della stringa creata e gestita dall'istanza _bstr_t
che la rilascia una volta quando viene distrutta. L'operatore restituisce semplicemente un puntatore a questa copia. Pertanto, non è necessario copiare questa stringa. Inoltre, nella domanda, CString::GetBuffer
restituisce LPTSTR
(ad esempio TCHAR*
) e nonLPCTSTR
(ad esempio const TCHAR*
).
Un'altra opzione è quella di utilizzare macro di conversione:
USES_CONVERSION;
const WCHAR* wc = L"Hello World" ;
const char* c = W2A(wc);
Il problema con questo approccio è che la memoria di stringa convertita viene allocata sulla pila, in modo che la lunghezza della stringa è limitata. Tuttavia, questa famiglia di macro di conversione consente di selezionare la tabella codici da utilizzare per la conversione, che è spesso necessaria se la stringa ampia contiene caratteri non ANSI.
Sono così tentato di fare +1 su questo. '_bstr_t' e' _variant_t' erano i miei migliori amici ai tempi in cui avevi davvero bisogno di ATL per fare un buon componente COM in C++ – sehe
ma non ha copiato il wc in c – jack
perché dovrebbe copiarlo? il tuo codice mostra solo che devi usarlo in 'printf'. '_bstr_t' si occuperà di rilasciare la memoria.Se è necessario mantenere una copia e inviare la stringa, utilizzare l'istanza '_bstr_t', non' const char * '- in questo senso,' _bstr_t' è simile a 'CString'. Si occupa di copiare i dati di stringa correttamente quando vengono utilizzate più copie dell'oggetto (anche se non usa * copy-on-write *). –
Si potrebbe fare questo, o si potrebbe fare qualcosa di più pulito:
std::wcout << L"output: " << output.GetString() << std::endl;
E 'abbastanza facile, perché CString
è solo un typedef per CStringT
, e si ha anche accesso a CStringA
e CStringW
(si dovrebbe leggere la documentazione sulle differenze).
CStringW myString = L"Hello World";
CString myConvertedString = myString;
'CStringA myConvertedString (L" Hello World ");' funziona anche – Rost
Sì, me ne rendo conto, ma è stato scritto in questo modo per essere più vicino al suo codice di esempio. –
Che cosa fa questa conversione con caratteri grandi che non hanno un carattere stretto corrispondente? –
È possibile utilizzare sprintf
per questo scopo:
const char output[256];
const WCHAR* wc = L"Hellow World" ;
sprintf(output, "%ws", wc);
Non penso che si possa dichiarare 'output' come' const' – CinCout
Il mio codice per 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;
}
Come costruire
#!/bin/sh
NAME=`basename $0 .sh`
CC=/usr/bin/g++-4.9
INCS="-I."
LIBS="-L."
$CC ${NAME}.c -o _${NAME} $INCS $LIBS
uscita
$ ./_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. Come convertire wchar_t * a const char *
- 2. Impossibile convertire 'const char *' in 'WCHAR *' nell'argomento che passa
- 3. Come convertire v8 :: String a const char *
- 4. const char * myVar vs. const char myVar []
- 5. Come convertire std :: string in const char *?
- 6. Come convertire 'wchar_t *' in 'const char *'
- 7. Converti const char * in const wchar_t *
- 8. C: Assegnazione di "static const char * const" a "static const char *"
- 9. C++: char ** a const char ** conversione
- 10. printf% s const char *
- 11. Converti CString in const char *
- 12. La conversione da const char * a const std :: string &
- 13. const char * concatenazione
- 14. const char * inizializzazione
- 15. Come convertire un boost :: filesystem :: directory_iterator in un const char *
- 16. Come trasformare 'const boost :: filesystem2 :: path' in 'const char *'?
- 17. Come creare una matrice const statico const char *
- 18. come convertire il valore uint64_t nella stringa const char?
- 19. const unsigned char * a std :: string
- 20. Delphi Da PChar a C++ const char *
- 21. sovraccarico con rvalue riferimento a const char *
- 22. const constexpr char * vs. constexpr char *
- 23. C++ converte char in const char *
- 24. Funzione C++ restituendo const char *
- 25. Converti const char ** in void *?
- 26. non può convertire 'LPCWSTR {aka const wchar_t *}' in 'LPCSTR {aka const char *}
- 27. Perché è possibile assegnare un const char * a un char *?
- 28. extern const char * const SOME_CONSTANT mi dà errori del linker
- 29. conversione non valida da 'const char *' a 'char *' [-fpermissive]
- 30. Convertire un 'System :: String ^' in 'const char *' in vC++
Si prega di aggiungere una spiegazione, come codice puro, non dice molto. – Kao
Non hai bisogno di GetBuffer. CString ha un operatore LPCTSTR che accede al buffer interno. – MikMik
quale dovrebbe essere l'output se 'wc' è' привет мир'? ti interessa le code page o questa è solo ampia -> conversione stretta con tutti i caratteri ampi che sono caratteri ANSI? –