如何使用unicode文件名打开std :: fstream(ofstream或ifstream)?

时间:2009-05-04 20:24:53

标签: c++ windows unicode

你不会想象像使用C ++标准库为Windows应用程序打开文件那样基本的东西很棘手......但它似乎是。在这里,我的意思是UTF-8,但我可以转换为UTF-16或其他任何东西,重点是从Unicode文件名获取一个ofstream实例。在我推出自己的解决方案之前,这里有一条首选路线吗?特别是跨平台的?

7 个答案:

答案 0 :(得分:55)

C ++标准库不支持Unicode。 <{1}}和char不需要是Unicode编码。

在Windows上,wchar_t是UTF-16,但标准库中没有直接支持UTF-8文件名(wchar_t数据类型在Windows上不是Unicode)

使用MSVC(以及Microsoft STL),提供了一个文件流构造函数,它采用char文件名,允许您创建流:

const wchar_t*

但是,C ++ 11标准未指定此重载(它仅保证存在基于wchar_t const name[] = L"filename.txt"; std::fstream file(name); 的版本)。它也不存在于替代STL实现中,如GCC的用于MinGW的libstdc ++(-w64),从版本g ++ 4.8.x开始。

请注意,就像Windows上的char不是UTF8一样,在其他操作系统上char可能不是UTF16。总的来说,这不太可能是便携式的。打开给定wchar_t文件名的流不是根据标准定义的,并且在wchar_t中指定文件名可能很困难,因为char使用的编码在OS'之间有所不同。

答案 1 :(得分:3)

当前版本的Visual C ++ std :: basic_fstream有一个open()方法,根据http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx获取wchar_t *。

答案 2 :(得分:2)

使用std::wofstreamstd::wifstreamstd::wfstream。他们接受unicode文件名。文件名必须为wstringwchar_t的数组,或者文本前必须有_T()宏或前缀L

答案 3 :(得分:2)

从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)。

答案 4 :(得分:1)

查看Boost.Nowide

#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cout.hpp>
using boost::nowide::ifstream;
using boost::nowide::cout;

// #include <fstream>
// #include <iostream>
// using std::ifstream;
// using std::cout;

#include <string>

int main() {
    ifstream f("UTF-8 (e.g. ß).txt");
    std::string line;
    std::getline(f, line);
    cout << "UTF-8 content: " << line;
}

答案 5 :(得分:1)

如果您将Qt与 <div id="content"> <h3>Electrophotonique Ingénierie : Nouvelle approche de l'imagerie macroscopique par effet de couronne dans le domaine de la santé et des biotechnologies.</h3> <div id="file" action="" class = "container"> <input id = "stress" type="image" src="IMAGES/PNG/hydricstress.png" /> <div class = "text"> Stress hydrique </div> </div> <!-- The hydric stress Modal --> <div id="hydricstressmodal" class="hydricstressmodal"> <div class="stress-content"> <span class="stressclose">&times;</span> <div class ="popstress" ><img src="images/png/hydricstress.png"></div> <p>Some text in the Modal..</p> </div> </div> <div id="file" action="" class = "container"> <input id = "vegetal" type="image" src="IMAGES/PNG/vegetal.png" /> <div class = "text"> Biophotonique appliquée aux végétaux </div> </div> </div> <!-- The vegetal Modal --> <div id="vegetalmodal" class="vegetalmodal"> <div class="vegetal-content"> <span class="vegetalclose">&times;</span> <div class ="popvegetal" ><img src="images/png/vegetal.png" ></div> <p>Some text in the Modal..</p> </div> </div> <div id="file" action="" class = "container"> <a href="#bridge"><img src="IMAGES/PNG/pont.png" width="100%" /></a> <div class = "text"> Etudes des ponts photoniques </div> </div> <script type="text/javascript" src="JS/sticky_navbar.js"></script> <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script> <script src="js/index.js"></script> <script src="js/button.js"></script>混合使用:

std::ifstream

答案 6 :(得分:-1)

使用

wfstream

代替

fstream

wofstream

代替

ofstream

,依此类推... 您可以在iosfwd头文件中找到此信息。