0

外部プログラムを呼び出して作業を完了する 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マクロを調べる必要があります)。

4

1 に答える 1

0

これは暗闇の中のショットかもしれませんが、ファイル名から感嘆符を削除するか、%21 に置き換えることをお勧めしますか?

デバッガーが行うことは、バッチ スクリプトを使用して非表示のコンソールでプログラムを実行することだけです。システムのコマンド プロセッサの "Delayed Environment Variable Expansion" がデフォルトで ON に設定されている場合 (通常はそうです)、'!' コマンドラインから破棄されます。

  • アラン

PS

この設定はレジストリにあり、ローカルまたはグローバルにオフにすることができます。

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

PPS 同様の理由で % を %% に置き換える必要があるかもしれません。

于 2013-12-03T01:33:38.417 に答える