QFile Unicode路径 - 文件不存在

时间:2013-12-01 21:14:43

标签: qt unicode path urldecode qfile

我写了一个Firefox plugin来调用外部程序来完成工作:)。麻烦是Firefox在你传递参数时无法处理Unicode,所以当我打电话给我的前任时,我不得不跳过一些箍。

我一直在做的是使用URI编码的字符串,而我正在使用QT库来处理Unicode字符串的难题。但我无法让QT的QFile在Unicode路径上找到任何东西。

我从这样的字符串开始:

C:\ temp \ private \ Power Up!.mp3

我将其编码为:

C%3A%5Ctemp%5C%E7%A7%81%5CPower%20Up!.MP3

然后我将它作为命令行参数传递。现在我在Visual C ++ 2010 Express Edition编译器的调试命令行参数中传递它。

最后我尝试这样做:

std::string fileName( "c:\\temp\\debug " );
std::string extension (".txt");
ofstream a_file ( fileName + extension );
QString filepath ( argv[argc - 1] );

QString url = QUrl::fromPercentEncoding( filepath.toUtf8() ).replace("\\","/");

a_file << "Param: " << url.replace("\\","/").toStdString()  << "\n\n";

QFile myQfile ( url.replace("\\","/") ); // Replacing every backslash with a forward slash 
                                         // QT doesn't allow backslashes in paths.

if( !myQfile.exists() ){
    a_file << "The param \""  << myQfile.fileName().toStdString() << "\" is not a file.";
    a_file.close();
    exit(1);
}//END IF

如果我没有通往“私人”的道路。字符它工作正常,但否则对exists()的调用返回false,我最终退出。我知道文件在那里,当我在notepad ++中检查我的调试文件时,它有正确的字符。

谁能看到我做错了什么?

编辑:

我想我可能已经得到了它。

首先我切换到这样的wmain:

int wmain(int argc, wchar_t *argv[])

然后我像这样设置我的QStrings:

QString filepath = QString::fromWCharArray ( argv[argc - 1] );

QString url = QUrl::fromPercentEncoding( filepath.toLocal8Bit() );

TagLib::FileRef f( url.toStdWString().c_str() );

到目前为止这是有效的。我需要做更多测试:),我90%肯定这不会在Linux / OSX中编译(我需要在Linux中构建QT以查找,并查看wchar_t宏)。

1 个答案:

答案 0 :(得分:0)

这可能是在黑暗中拍摄的,但我建议您尝试从文件名中删除感叹号或将其替换为%21

所有调试器都使用批处理脚本在隐藏控制台中运行程序。如果恰好是(并且通常是)你的系统的命令处理器默认情况下将“延迟环境变量扩展”设置为ON,那么'!'将从命令行中丢弃。

  • 艾伦

P.S。

此设置可在注册表中找到,并在本地或全局关闭:

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Command Processor \ DelayedExpansion HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor \ DelayedExpansion

P.P.S。 出于类似原因,您可能还需要将%替换为%%。