Ich habe die neue Unicode-Funktionalität von C++ 11 untersucht, und während other C++11 encoding questions sehr hilfreich waren, habe ich eine Frage zu dem folgenden Code-Snippet von . Der Code schreibt und liest sofort eine Textdatei, die mit der UTF-8-Codierung gespeichert wurde.Lesen/Schreiben/Drucken 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';
Meine Frage ganz einfach ist, warum ist ein wchar_t
in der for
Schleife benötigt? Ein u8
String-Literal kann mit einem einfachen char *
deklariert werden und das Bit-Layout der UTF-8-Codierung sollte dem System die Zeichenbreite mitteilen. Es scheint, es gibt eine automatische Konvertierung von UTF-8 zu UTF-32 (daher die wchar_t
), aber wenn dies der Fall ist, warum ist die Konvertierung notwendig?
Es hängt von vielen Dingen ab. Bemerkenswertes, korrektes UTF8-Verhalten ist extrem hart, wenn nicht unmöglich, unter Verwendung von Windows in einer Konsolenanwendung (erfordert mindestens eine große Anzahl von Nicht-Standard-API-Aufrufen IIRC) – sehe
'wchar_t' wird verwendet, weil' wifstream' verwendet wird und 'wifstream' ausführt dass "einige automatische Konvertierung" Sie erwähnen. Mein Punkt war, den Unterschied zwischen dieser automatischen Konvertierung (wie für eine bestimmte Plattform implementiert) und der expliziten, portablen, länderunabhängigen Unicode-Konvertierung, die von 'codecvt_utf8_utf16' bereitgestellt wird, zu zeigen. – Cubbi