如何在C Windows程序中將代碼頁設置爲UTF-8?Windows中的UTF-8
我有一個使用fopen打開文件的第三方庫。我可以使用wcstombs將我的Unicode文件名轉換爲當前的代碼頁,但是如果用戶在代碼頁之外具有一個字符的文件名,那麼這會中斷。
理想情況下,我只需調用_setmbcp(65001)將代碼頁設置爲UTF-8,但是_setmbcp的MSDN文檔聲明不支持UTF-8。
我該如何解決這個問題?
如何在C Windows程序中將代碼頁設置爲UTF-8?Windows中的UTF-8
我有一個使用fopen打開文件的第三方庫。我可以使用wcstombs將我的Unicode文件名轉換爲當前的代碼頁,但是如果用戶在代碼頁之外具有一個字符的文件名,那麼這會中斷。
理想情況下,我只需調用_setmbcp(65001)將代碼頁設置爲UTF-8,但是_setmbcp的MSDN文檔聲明不支持UTF-8。
我該如何解決這個問題?
不幸的是,沒有辦法使Unicode成爲Windows中的當前代碼頁。 CP_UTF7
和CP_UTF8
常數是僞代碼頁,僅在MultiByteToWideChar和WideCharToMultiByte轉換函數中使用,如Ben提到的。
你的問題類似於fstream C++類。 fstream構造函數只接受char*
名稱,因此無法使用真正的Unicode名稱打開文件。 VC提供的唯一解決方案是黑客攻擊:單獨打開文件,然後將句柄設置爲流對象。恐怕這不適合你,當然,因爲第三方庫可能不接受句柄。
我能想到的唯一解決方案是創建一個非Unicode名稱的臨時文件,該文件與原始文件硬連接,並將其用作參數。
所有的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;
}
而且類似形式的東西轉換回。
使用cygwin(默認情況下提供UTF-8語言環境),或者爲Windows編寫自己的libc hack,以執行必要的UTF-8轉換爲UTF-16轉換幷包裝非標準_wfopen
等功能。
真的嗎?你會建議嗎? – 2014-05-25 08:20:55