我编写了一个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 宏)。