2008-10-03 35 views
23

如何在C Windows程序中將代碼頁設置爲UTF-8?Windows中的UTF-8

我有一個使用fopen打開文件的第三方庫。我可以使用wcstombs將我的Unicode文件名轉換爲當前的代碼頁,但是如果用戶在代碼頁之外具有一個字符的文件名,那麼這會中斷。

理想情況下,我只需調用_setmbcp(65001)將代碼頁設置爲UTF-8,但是_setmbcp的MSDN文檔聲明不支持UTF-8。

我該如何解決這個問題?

回答

25

不幸的是,沒有辦法使Unicode成爲Windows中的當前代碼頁。 CP_UTF7CP_UTF8常數是僞代碼頁,僅在MultiByteToWideCharWideCharToMultiByte轉換函數中使用,如Ben提到的。

你的問題類似於fstream C++類。 fstream構造函數只接受char*名稱,因此無法使用真正的Unicode名稱打開文件。 VC提供的唯一解決方案是黑客攻擊:單獨打開文件,然後將句柄設置爲流對象。恐怕這不適合你,當然,因爲第三方庫可能不接受句柄。

我能想到的唯一解決方案是創建一個非Unicode名稱的臨時文件,該文件與原始文件硬連接,並將其用作參數。

10

所有的Windows API都以UTF-16的形式考慮,所以你最好在你的庫上編寫一個包裝器,以便在邊界進行轉換。

奇怪的是,Windows認爲UTF-8是轉換的目的代碼頁,讓你用相同的API,你會以代碼頁之間的轉換:

std::wstring Utf8ToUtf16(const char* u8string) 
{ 
    int wcharcount = strlen(u8string); 
    wchar_t *tempWstr = new wchar_t[wcharcount]; 
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount); 
    wstring w(tempWstr); 
    delete [] tempWstr; 
    return w; 
} 

而且類似形式的東西轉換回。

-4

使用cygwin(默認情況下提供UTF-8語言環境),或者爲Windows編寫自己的libc hack,以執行必要的UTF-8轉換爲UTF-16轉換幷包裝非標準_wfopen等功能。

+2

真的嗎?你會建議嗎? – 2014-05-25 08:20:55