如何使用unicode文件名打开std::fstream(ofstream或ifstream)? 你不会想象一些基本的事情,比如使用C++标准库打开文件,因为Windows应用程序很棘手…但似乎是这样。这里所说的Unicode是指UTF-8,但我可以转换为UTF-16或其他格式,重点是从Unicode文件名获取ofstream实例。在我制定自己的解决方案之前,这里是否有首选路线?特别是跨平台的一个? < p>当前VisualC++的版本:STD::Basic FFScript有一个打开()//>代码,方法采用WCARGET**。P> > P > C++标准库不是Unicode感知的。code>char和wchar\t不要求是Unicode编码

如何使用unicode文件名打开std::fstream(ofstream或ifstream)? 你不会想象一些基本的事情,比如使用C++标准库打开文件,因为Windows应用程序很棘手…但似乎是这样。这里所说的Unicode是指UTF-8,但我可以转换为UTF-16或其他格式,重点是从Unicode文件名获取ofstream实例。在我制定自己的解决方案之前,这里是否有首选路线?特别是跨平台的一个? < p>当前VisualC++的版本:STD::Basic FFScript有一个打开()//>代码,方法采用WCARGET**。P> > P > C++标准库不是Unicode感知的。code>char和wchar\t不要求是Unicode编码,c++,windows,unicode,C++,Windows,Unicode,在Windows上,wchar\u t是UTF-16,但标准库中不直接支持UTF-8文件名(在Windows上,char数据类型不是Unicode) 在MSVC(以及Microsoft STL)中,提供了filestreams的构造函数,它采用const wchar\u t*文件名,允许您将流创建为: wchar_t const name[] = L"filename.txt"; std::fstream file(name); 但是,C++11标准没有指定此重载(它只保证存在基于char的版

在Windows上,
wchar\u t
是UTF-16,但标准库中不直接支持UTF-8文件名(在Windows上,
char
数据类型不是Unicode)

在MSVC(以及Microsoft STL)中,提供了filestreams的构造函数,它采用
const wchar\u t*
文件名,允许您将流创建为:

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


请注意,就像Windows上的
char
不是UTF8一样,其他操作系统上的
wchar\u t
可能不是UTF16。所以总的来说,这不太可能是便携式的。标准中没有定义给定
wchar\u t
文件名的流,在
char
s中指定文件名可能很困难,因为char所使用的编码在不同的操作系统中有所不同。

使用
std::wofstream
std::wifstream
std::wfstream
。他们接受unicode文件名。文件名必须是
wstring
wchar\u t
s数组,或者必须在文本前面有
\u t()
宏,或前缀
L

查看:

#包括
#包括
使用boost::nowide::ifstream;
使用boost::nowide::cout;
//#包括
//#包括
//使用std::ifstream;
//使用std::cout;
#包括
int main(){
IFF流(“UTF-8(例如ß).txt”);
std::字符串行;
std::getline(f,line);

cout如果您使用Qt与
std::ifstream混合使用

return std::wstring(reinterpret_cast<const wchar_t*>(qString.utf16()));
返回std::wstring(reinterpret_cast(qString.utf16());

请注意,
std::basic\u ifstream
构造函数通常不接受
常量w\u char*
,但是对于其他实现,您可能会调用
qString.utf8()
,并使用
const char*
ctor.

自C++17以来,有一种跨平台的方法可以使用重载打开具有Unicode文件名的std::fstream。示例:

std::ofstream out(std::filesystem::path(u8"こんにちは"));
out << "hello";
std::ofstreamout(std::filesystem::path(u8)こんにちは"));
退出使用

而不是

fstream
ofstream

而不是

fstream
ofstream
等等。。。

您可以在头文件中找到这些信息。

这最终/理论上是可移植的吗?并非所有的操作系统和文件系统都支持Unicode文件名,因此它不会是可移植的。从我收集的数据来看,wchar_*t*open()fstream上的构造函数是Microsoft扩展,因为NTFS确实支持Unicode文件名。或者更确切地说,因为NTFS使用UTF16编码Unicode文件名。Linux也支持Unicode文件名,但使用UTF8,所以常规的char*版本可以工作。如果使用MinGw编译器,则没有任何选项?这是一个问题。请查看NSWER可以提供帮助。为什么不使用像
std::wofstream
这样的数据类型呢?请注意w!中提供了一个更加完整和最新的答案,包括如何使用g++以及其他Windows API途径等。@MichalM:no.
wchar\u t
当然只是一个16位宽的字符类型,可以用来存储你喜欢什么都行。它不在乎编码。但是接受
wchar\t
参数的Win32 API希望它们包含UTF-16数据。Windows API自Windows 2000以来就没有使用过UCS-2,@MichalM:What is is is(不是它接近的东西,而是
wchar\t
中实际存储的东西)是一个UTF-16代码单元。它不是UCS-2,虽然它接近UCS-2,但它更接近UTF-16代码单元(因为它实际上是这样的).UTF-16指定一个由一个或两个代码单元表示的代码点,后者被称为代理项对。这个答案在C++17之后就过时了。真的吗?minigw中存在ofc,因为minigw是msvc CopyPaste。你能提供证据证明
std::wfstream
Unicode
?据我所知,他们只是我们e
wchar\u t
这是一个宽字符,通常是
16位
。但是内容可以是
Unicode
。我的意思是他们接受Unicode字符串,这回答了这个问题,不是吗?实际上它回答了一半的问题:假设你的wfstream中有文件路径UTF16(或者fstream中有UTF8)。Windows不接受unicode,如果您有一些特殊字符(如中文),则会返回“错误的url”。windows怎么能不接受unicode?你说的是windows的第一个版本吗?如果有人还在使用它们,他们还有更大的问题要解决。不过你可能是对的。我刚刚偶然发现了两个案例,我不得不用OfStream编写unicode字符,而wofstream没有帮助。我尝试了simple
file nowide,效果非常好。…遗憾的是,它不在标准的boost发行版中;但让它工作起来非常简单…能够最终避开wchar真是太好了:)当我在Windows上尝试此操作时,创建的文件名为“ã”ãã“ã«ãã”。(源文件另存为UTF-8)。要使此示例创建正确的文件名,您还必须执行其他步骤吗?流的
中没有接受
std::wstring
参数的
。这似乎是一个
ofstream