Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;正在使用非拉丁名称打开文件_C++_Linux_Qt_Stl_Fstream - Fatal编程技术网

C++ c++;正在使用非拉丁名称打开文件

C++ c++;正在使用非拉丁名称打开文件,c++,linux,qt,stl,fstream,C++,Linux,Qt,Stl,Fstream,我有这样的档案。我只想正确打开非拉丁名称的文件。 我对只有拉丁名称和非拉丁名称的文件没有问题 我使用QDir扫描目录,我在QString中保存名称,所以它在内部保存得很好 但是打开文件时存在一个瓶颈。 它使我不想使用qFrm,我只能使用C++流(更优选)或C文件。 当我想打开文件时,我会这样做: fstream stream(source.toStdString().c_str(),ios_base::in | ios_base::binary); 之后,我检查尝试是否成功: if(!s

我有这样的档案。我只想正确打开非拉丁名称的文件。
我对只有拉丁名称和非拉丁名称的文件没有问题

我使用QDir扫描目录,我在QString中保存名称,所以它在内部保存得很好

但是打开文件时存在一个瓶颈。 它使我不想使用qFrm,我只能使用C++流(更优选)或C文件。 当我想打开文件时,我会这样做:

fstream stream(source.toStdString().c_str(),ios_base::in | ios_base::binary);
之后,我检查尝试是否成功:

  if(!stream.is_open())
   { cout<<"file wasn't opened " <<source.toStdString().c_str())<<"\n";
     return false; // cout was redirected to file // just a notice
   }
如果(!stream.is_open())

{cout在您的QString上调用
tostString()
时出错。如果设置了
QTextCodec::codeforcstrings()
,它将基于
QTextCodec::codeforcstrings()转换内容,否则将使用拉丁-1。拉丁-1将把非拉丁字符折叠为“?”


使用
source.toLocal8Bit().data()
source.toUtf8().data()
相反,它可能会做你想做的事情,但如果做不到这一点,你需要处理QTextcodec以获得正确的8位编码。

QString
具有
toLocal8Bit
toUtf8
。我猜toLocal8Bit应该在Windows上使用,而toUtf8应该在Linux上使用,对吗?这是因为在Windows本地应用程序上可以使用epage(但如果使用utf-16呢?),在Linux上默认使用utf8编码/@gekannt始终使用toLocal8Bit()。假设Linux“默认使用utf8”是完全错误的。即使大多数发行版都是这样,它也可能随时更改,因此您的代码可能会失败。事实上,我认为Linux并不关心文件名的编码方式。对于内核来说,文件名只是一组字节,不包括(“/”和<0x20以下的任何内容)这恰好是8位干净的,并且在该目录中必须是唯一的。这很好。但正如我所知,本地编码不能支持几种语言,例如,不可能包含在一种本地编码中德语+俄语或汉语+希伯来语。问题是,文件名可能包含几种语言的符号,如果所以,如果我只做tolocal8bit,我就忽略了用户将来会遇到的问题。