Nota che stai utilizzando flussi C. I flussi C hanno una qualità molto speciale chiamata "orientamento". Un flusso è o non orientato, largo o stretto. L'orientamento è deciso dalla prima uscita fatto per qualsiasi flusso particolare (v http://en.cppreference.com/w/cpp/io/c per una sintesi dei flussi CI/O)
Nel tuo caso, stdout
inizia non orientato, e eseguendo il primo printf
, si sta impostando lo stretto . Una volta stretto, è bloccato stretto e wprintf
non riesce (controllare il suo codice di ritorno!). L'unico modo per cambiare un flusso C è freopen
, che non funziona abbastanza con stdout. Ecco perché 3 e 4 non hanno stampato.
Le differenze tra 1 e 3 è che 1 è una funzione di uscita stretta che utilizza l'identificatore di conversione stringhe strette% s: legge byte dall'array di caratteri e invia byte in un flusso di byte.3 è una funzione di uscita ampia con un identificatore di conversione stringhe strette% s: prima legge i byte dal char array e mbtowc
s in wchar_t
s, quindi invia wchar_t
s in un flusso ampio, che quindi wctomb
s in byte o sequenze multibyte che vengono poi spinti nello standard con un write
Infine, se widestr è in utf16, è necessario utilizzare Windows e tutte le scommesse sono disattivate; c'è molto poco supporto per qualsiasi cosa al di fuori di ASCII su quella piattaforma. Puoi anche cedere e usare WinAPI (puoi cavartela con lo standard C++ 11 per alcune cose Unicode, e persino fare questo output C, con le parole magiche _setmode(_fileno(stdout), _O_U16TEXT);
, che è stato discusso abbastanza volte)
Hai letto il documentazione? In particolare di [cstdio] (http://www.cplusplus.com/reference/cstdio/)? –
"widestr is in utf16" implica che stai usando Windows (più sistemi Unicode utilizzano UTF-32 come predefinito per le stringhe larghe). Ci sono molti arcani cerchi da saltare se vuoi fare qualcosa oltre l'ASCII su un sistema Windows usando standard C++ o C. Potresti anche cedere e usare WinAPI. – Cubbi
NON DARE A MICROSOFT STUPIDITY. Salva te stesso il dolore e scrivi la tua libreria di stringhe. Per l'amore di dio NON usare le conversioni di windows e altre follia, fidati di me, è orrendo e nella confusione si insinuano tutti i tipi di errori. – Owl