你不会想象像使用C ++标准库为Windows应用程序打开文件那样基本的东西很棘手......但它似乎是。在这里,我的意思是UTF-8,但我可以转换为UTF-16或其他任何东西,重点是从Unicode文件名获取一个ofstream实例。在我推出自己的解决方案之前,这里有一条首选路线吗?特别是跨平台的?
答案 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::wofstream
,std::wifstream
和std::wfstream
。他们接受unicode文件名。文件名必须为wstring
,wchar_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">×</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">×</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)