0

我编写了一个Firefox 插件,它调用外部程序来完成工作:)。问题是当你传递参数时 Firefox 无法处理 Unicode,所以当我调用我的前任时,我不得不跳过一些障碍。

我一直在做的是使用 URI 编码的字符串,而我正在使用 QT 库来完成处理 Unicode 字符串的困难工作。但我无法让 QT 的 QFile 在 Unicode 路径上找到任何内容。

我从这样的字符串开始:

C:\temp\私\加电!.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,我最终退出。我知道文件在那里,当我在记事本++中检查我的调试文件时,它有正确的字符。

谁能看到我做错了什么?

编辑:

我想我可能已经明白了。

首先,我像这样切换到 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 宏)。

4

1 回答 1

0

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

调试器所做的只是使用批处理脚本在隐藏控制台中运行程序。如果碰巧(通常是)您的系统的命令处理器将“延迟环境变量扩展”默认设置为 ON,那么“!” 将从命令行中丢弃。

  • 艾伦

附言

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

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

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

于 2013-12-03T01:33:38.417 回答