Riassunto:
TCHAR e' una macro!
_tmain. e' una macro
che puo' usare char o wchar_t a seconda delle opzioni di compilazione!
L"abc": e' una stringa di wchar_t
wout: e' l'output stream in wchar_t
out: e' l'output stream per char
wmain: e' il main in wchat_t
main: e' il main in char.
Se si mescolano macro, opzioni di compilazione, char e wchar_t senza controllo, si ottengono i risultati indicati.
Per non parlare della giungla tra codepage, encoding, ascii, unicode, utf8, utf16, utf32, windows-1252, little endian,, big endian...
Per iniziare conviene scegliere dall'inizio se lavorare con i caratteri a 8bit (char, ed anche qui' c'e' da vedere se il char e' signed o unsigned, meglio unsigned) e con quale codepage o a 16bit (wchar_t) e quale encoding utilizzare per la serializzazione delle stringhe. Per non sapere leggere ne scrivere, meglio che sia l'UTF8.
E mantenere queste impostazioni durante tutto lo sviluppo.
Se poi uno vuole proprio farsi del male...
Usare char, stringhe in wchar_t, caratteri >127 (le accentate, i simboli monetari, ... ) senza conoscere esattamente il codepage e le opportune conversioni e' fonte di rogne indicibili.
Mantenere la coerenza tra i vari encoding non si risolve con un post.
A si, poi c'e' un'altra rogna: serve sapere esattamente quale encoding viene utilizzato per salvare il sorgente su disco da parte dell'ide.
E bisogna stare attenti quando si apre il file con un'altro editor: deve leggere e salvare il file con lo stesso encoding!
Quello che succede e' che si pasticcia tra utf8 e windows-1252.
Il risultato e' che e caratteri > 128
si vedono corretti in un caso, ma sbagliati in un'altro.
E per concludere, l'encoding e' la fonte principale di attrito tra chi sviluppa per il web: chissa' perche' nel 50% dei siti italiani le accentate si vedono male (cioe' sono dei caratteri strani)