我一直在探索C++ 11的新Unicode功能,雖然other C++11 encoding questions已經非常有幫助,但我對cppreference以下代碼段有疑問。代碼寫入並立即讀取以UTF-8編碼保存的文本文件。在C++中讀寫/打印UTF-8 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';
是很簡單的,爲什麼是wchar_t
需要在for
環路我的問題? A u8
字符串文字可以使用簡單的char *
來聲明,而UTF-8編碼的位佈局應該告訴系統字符的寬度。看起來有一些從UTF-8到UTF-32的自動轉換(因此wchar_t
),但如果是這種情況,爲什麼需要轉換?
這取決於很多事情。值得注意的是,正確的UTF8行爲在控制檯應用程序中使用Windows時不是不可能的(如果不是不可能的話)(要求_至少有很多非標準API調用IIRC) – sehe 2013-03-18 10:57:10
使用'wchar_t'是因爲使用了wifstream而wifstream執行你提到的「一些自動轉換」。我的觀點是要展示自動轉換(爲一個特定平臺實現)和'codecvt_utf8_utf16'提供的明確的,可移植的,與區域無關的Unicode轉換之間的區別。 – Cubbi 2013-03-18 14:29:33