使用std::cout 在Windows 上跨平台UTF-8 輸出
在使用C 語言開發對字串進行編碼的跨平台應用程式時在UTF-8 中,確保在不同作業系統中正確處理它們至關重要。在 Unix 系統上,std::cout 期望 UTF-8 編碼的 8 位元字串沒有問題。但是,在 Windows 上,它預設為 Latin-1 或類似的非 Unicode 格式。
為了解決這個問題,程式碼嘗試使用 _setmode() 強制 std::cout 將 8 位元字串解釋為Windows 上的 UTF-8。但是,這會在 Visual Studio 2015 中觸發斷言錯誤。
要解決此問題,需要更全面的方法。下面所示的程式碼結合了各種來源的見解:
<code class="cpp">#include <string> #include <iostream> #include <Windows.h> #include <cstdio> int main() { // Set console code page to UTF-8 SetConsoleOutputCP(CP_UTF8); // Enable stream buffering to prevent byte-by-byte output setvbuf(stdout, nullptr, _IOFBF, 1000); std::string test = u8"Greek: αβγδ; German: Übergrößenträger"; std::cout << test << std::endl; return 0; }</code>
首先,SetConsoleOutputCP()函數用於將控制台的程式碼頁設定為UTF-8,表示應該解釋接收到的位元組流作為UTF-8。
接下來,使用 setvbuf() 為 std::cout 啟用緩衝。這是因為 Visual Studio 的 STL 實現的預設行為是將單一位元組傳遞到基礎文件,導致 UTF-8 位元組序列出現問題。緩衝可以防止此問題並提高效能。也建議定期使用 std::endl 刷新流,如此例所示。
最後,請注意,為了正確顯示非 ASCII Unicode 字符,Windows 控制台必須使用 TrueType 字型。這是 Windows 10 中的預設字體,但在 Windows 7 或更早版本上,使用者可能需要手動將其變更為 Consolas 等字體。
以上是如何在Windows上使用std::cout實現跨平台UTF-8輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!