Odkryłem nową funkcjonalność Unicode w C++ 11, a podczas gdy other C++11 encoding questions były bardzo pomocne, mam pytanie dotyczące następującego fragmentu kodu z cppreference. Kod zapisuje, a następnie natychmiast odczytuje plik tekstowy zapisany z kodowaniem UTF-8.Czytanie/pisanie/drukowanie UTF-8 w 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';
Moje pytanie jest po prostu, dlaczego potrzebny jest wchar_t
w pętli for
? Literał łańcuchowy u8
można zadeklarować za pomocą prostego char *
, a układ bitowy kodowania UTF-8 powinien informować system o szerokości znaku. Wygląda na to, że istnieje pewna automatyczna konwersja z UTF-8 na UTF-32 (stąd wchar_t
), ale jeśli tak jest, dlaczego konwersja jest konieczna?
To zależy od wielu rzeczy. Zauważalne, poprawne zachowanie UTF8 jest niezwykle trudne, jeśli nie niemożliwe, używając Windows w aplikacji konsolowej (wymagającej _a co najmniej_ dużej liczby niestandardowych wywołań API IIRC) – sehe
'wchar_t' jest używany, ponieważ' wifstream' jest używany, a 'wifstream' wykonuje że "niektóre automatyczne konwersje" wspominasz. Chciałem pokazać różnicę między tą automatyczną konwersją (zaimplementowaną dla jednej konkretnej platformy) a jawną, przenośną, niezależną od ustawień lokalnych konwersją Unicode zapewnioną przez 'codecvt_utf8_utf16'. – Cubbi