Ho esplorato la nuova funzionalità Unicode di C++ 11 e mentre other C++11 encoding questions sono stato molto utile, ho una domanda sul seguente frammento di codice da cppreference. Il codice scrive e legge immediatamente un file di testo salvato con la codifica UTF-8.Lettura/scrittura/stampa UTF-8 in C++ 11
// Write
std::ofstream("text.txt") << u8"z\u6c34\U0001d10b";
// Read
std::wifstream file1("text.txt");
file1.imbue(std::locale("en_US.UTF8"));
std::cout << "Normal read from file (using default UTF-8/UTF-32 codecvt)\n";
for(wchar_t c; file1 >> c;) // ?
std::cout << std::hex << std::showbase << c << '\n';
La mia domanda è molto semplicemente, perché è un wchar_t
necessaria nel ciclo for
? Una stringa letterale u8
può essere dichiarata utilizzando un semplice char *
e il layout di bit della codifica UTF-8 dovrebbe indicare al sistema la larghezza del carattere. Sembra che ci sia una conversione automatica da UTF-8 a UTF-32 (da cui il wchar_t
), ma se questo è il caso, perché è necessaria la conversione?
Dipende da molte cose. Notevole, il comportamento corretto di UTF8 è estremamente difficile se non impossibile utilizzando Windows in un'applicazione console (che richiede _almeno_ un buon numero di chiamate API non standard IIRC) – sehe
'wchar_t' è usato perché' wifstream' è usato, e 'wifstream' esegue che "qualche conversione automatica" menziona. Il mio punto era mostrare la differenza tra quella conversione automatica (come implementata per una piattaforma particolare) e la conversione Unicode, portatile, indipendente dalla locale, fornita da 'codecvt_utf8_utf16'. – Cubbi