我遇到了boost文件流的問題:我需要在windows下的用戶目錄中創建和修改文件。然而,用戶名包含一個變音符號,它在MinGW下編譯時會失敗,因爲標準缺少boost_使用的文件流的wide_char open()API。請參閱Read/Write file with unicode file name with plain C++/Boost,UTF-8-compliant IOstreams和https://svn.boost.org/trac10/ticket/9968在MinGW下使用boost :: filestream的UTF-8名稱
但是我碰到了這個問題,這個問題主要發生在嘗試使用系統代碼頁之外的字符時。在我的情況下,我只使用系統代碼頁中的字符,因爲用戶目錄顯然存在。這讓我覺得,這應該工作,如果我能告訴的boost ::路徑期望所有std::string
S作爲beeing UTF8但在調用string()
成員函數(其中發生在boost::fstream::open
)
所以當把它們轉換成系統編碼基本上:有沒有辦法使用boost(和boost locale)自動地進行轉換(UTF8->系統編碼)?
是完整的,這裏是我設置的區域代碼:
#ifdef _WIN32
// On windows we want to enforce the encoding (mostly UTF8). Also using "" would use the default which uses "wrong" separators
std::locale::global(boost::locale::generator().generate("C"));
#else
// In linux/OSX this suffices
std::locale::global(std::locale::classic());
#endif // _WIN32
// Use also the encoding (mostly UTF8) for bfs paths
bfs::path::imbue(std::locale());
是的,我猜我需要這樣下去。我甚至想創建一個新的iofstream類,就像boost類一樣提供新的開放函數和ctors。你爲什麼要轉換回UTF8? CP_ACP不會更好嗎?爲什麼助推不會這樣,因爲這看起來很簡單。像8.3這樣的名稱並不總是在ANSI或者ANSI之類的缺點? – Flamefire
發現退縮:這隻適用於現有文件。所以需要確保文件確實存在,這可能會在嘗試使用widechar實現創建並使用短路徑方式打開時爲競爭條件打開大門。 – Flamefire
因爲它是跨平臺的。所有現代* nixen將打開一個UTF-8文件名,並且不會破壞舊代碼。同樣,_all_ Windows文件名可以轉換爲OS可接受的8.3文件名「token」,這在技術上是UTF-8子集。 –