PDA

Visualizza la versione completa : [c++] Stampa lettere accentate con cout del Visual C++ 2008


webc
10-11-2009, 20:57
Ciao,

scusate ma sto imparando ora ad utilizzzare Visual C++ 2008 Express Edition.
facendo una qualsiasi stampa, con cout, di stringhe che contengono caratteri accentati ottengo dei simboli strani a console.
Nelle properties del progetto ho visto che è settata la codifica unicode; non so che altro guardare.
Consigli?

Grazie

shodan
10-11-2009, 21:19
Normale. La console utilizza il codepage OEM corrente per l'output e tutti i caratteri > 127 sono diversi da quelli che ci si aspetta.
I settaggi UNICODE dell'ambiente non centrano col tuo problema.
Se per te non è un problema puoi sostituire l'accento con l'apostrofo, altrimenti devi convertire la stringa da ANSI a UNICODE e da UNICODE a OEM.

Se intendi percorrere questa strada, le API sono:

MultiByteToWideChar con flag CP_ACP per convertire ANSI -> UNICODE
http://msdn.microsoft.com/en-us/library/dd319072%28VS.85%29.aspx

WideCharToMultiByte con flag CP_OEM per convertire UNICODE -> OEM
http://msdn.microsoft.com/en-us/library/dd374130%28VS.85%29.aspx

MItaly
10-11-2009, 23:31
In alternativa puoi utilizzare gli stream Unicode wcin e wcout al posto dei soliti cin e cout.

ivenuti
11-11-2009, 11:20
per curiosità ho provato anche io a fare


std::wcout << "è un esempio!" << std::endl;


ma il risultato è identico a cout indicato da webc!
La cosa mi interessa: c'è un modo diverso di usare le costanti stringa per questi casi?

XWolverineX
11-11-2009, 11:52
wcout prende un wchar_t quindi ci vuole il L davanti la stringa.
La cosa interessante (già provai a suo tempo) è che non funziona.



http://img109.imageshack.us/img109/7914/osso.jpg

XWolverineX
11-11-2009, 13:31
Se neanche oregon risponde, allora che Dio ci salvi.

webc
14-11-2009, 23:49
grazie a tutti per le risposte. Ma davvero speravo ci fosse un modo più semplice per stampare una semplice lettera accentata :master:

Domandona: succede così per tutti i compilatori del C++?? (bhe, tutti è un po' troppo, diciamo se sapete se esistono compilatori che "semplificano la vita" o se è proprio una cosa legata allo standard che definisce il C++)

grazie ancora!!

shodan
15-11-2009, 00:02
Non è un problema di compilatore o di linguaggio, ma di codifiche ANSI e di sistema operativo.
Solo i caratteri da 0 a 127 sono comuni ai vari codepage, il resto varia da sistema a sistema e da paese a paese ( e tralascio la codifica EBCDIC che cambia anche i caratteri 0 - 127).

Uno dei motivi per cui è nato UNICODE è per sopperire a queste diversità.

oregon
15-11-2009, 07:56
Originariamente inviato da webc
grazie a tutti per le risposte. Ma davvero speravo ci fosse un modo più semplice per stampare una semplice lettera accentata

Non sempre quello che appare semplice lo è veramente ...

Aggiungo un paio di righe a tutti gli ottimi interventi ...



TCHAR str[100];
CHAR oemstr[100];

DWORD lstringa = wsprintf(str, L"è un esempio");
CharToOemBuff(str, oemstr, lstringa);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), oemstr, lstringa, &lstringa, NULL);

MItaly
15-11-2009, 14:10
Non vorrei sbagliarmi, ma forse (non ho provato e potrebbe essere una cavolata) c'entra anche il codepage in cui è salvato il sorgente...

Loading