亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用Unicode文件名打開std :: fstream(流或ifstream)?

如何使用Unicode文件名打開std :: fstream(流或ifstream)?

C++
明月笑刀無情 2019-10-21 11:01:56
您不會想到像使用針對Windows應用程序的C ++標準庫打開文件這樣的基本操作是棘手的……但是看起來確實如此。這里所說的Unicode是指UTF-8,但是我可以轉換為UTF-16或其他任何形式,關鍵是要從Unicode文件名獲取一個ofstream實例。在整理自己的解決方案之前,這里有首選的方法嗎?尤其是跨平臺的一個?
查看完整描述

3 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

C ++標準庫不支持Unicode。char并且wchar_t 不需要是Unicode編碼。


在Windows上wchar_t為UTF-16,但標準庫中不直接支持UTF-8文件名(charWindows上的數據類型不是Unicode)


使用MSVC(以及Microsoft STL),提供了用于const wchar_t*文件流的構造函數,該構造函數采用文件名,從而使您可以按以下方式創建流:


wchar_t const name[] = L"filename.txt";

std::fstream file(name);

但是,C ++ 11標準未指定此重載(它僅保證存在char基于版本的版本)。從g ++ 4.8.x版本開始,它也未出現在替代STL實現中,例如用于MinGW(-w64)的GCC libstdc ++。


請注意,就像char在Windows上不是UTF8一樣,在其他OS上wchar_t也可能不是UTF16。因此,總的來說,這不太可能移植。wchar_t根據標準未定義打開給定文件名的流,并且在chars中指定文件名可能很困難,因為char所使用的編碼在操作系統之間有所不同。


查看完整回答
反對 回復 2019-10-21
?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

從C ++ 17開始,有一種跨平臺的方法可以使用std :: filesystem :: path重載來打開具有Unicode文件名的std :: fstream 。在C ++ 20之前,您可以使用std :: filesystem :: u8path從UTF-8字符串創建路徑。例:


std::ofstream out(std::filesystem::u8path(u8"こんにちは"));

out << "hello";

在C ++ 20之后,您可以通過將UTF-8傳遞給構造函數來創建路徑std::filesystem::path(u8"こんにちは"):(不建議使用u8path)。


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 1316 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號