外部プログラムを呼び出して作業を完了する Firefox プラグインを作成します :)。問題は、引数を渡すときに Firefox が Unicode を処理できないことです。
私が行ってきたことは、代わりに URI でエンコードされた文字列を使用することであり、QT ライブラリを使用して Unicode 文字列を処理するという難しい作業を行っています。しかし、QT の QFile で Unicode パス上の何かを見つけることができません。
次のような文字列から始めます。
C:\temp\私\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() );
これはこれまでのところ機能します。さらにテストを行う必要があります:)、これがLinux / OSXでコンパイルされないことは90%確信しています(LinuxでQTをビルドして見つけ、wchar_tマクロを調べる必要があります)。