ボビンスの言うことが正確で、データを Java に直接確実に取得できない場合、別の言語 (C、C++、または C# など) で小さな「シム」プログラムを作成することも 1 つの代替ソリューションです。
この考え方は、プログラムが入力を UNICODE として取得し、ASCII 文字のみを使用して表現できるようにエンコードし (たとえば、base64 を使用するか、すべての文字を同等の数値としてエンコードするのと同じくらい簡単なことで)、コマンドライン引数を次のようにアセンブルするというものです。 CreateProcess を使用して Java 自体を使用および起動します。
Java コードはエンコーディングを「元に戻す」ことができ、UNICODE 名を再構築して使用を続行できます。これは少し回りくどい方法であり、ソフトウェアに追加のコンポーネントが必要ですが、実際の制限である場合は、上記の制限を回避する必要があります。
更新: これは shim プログラムの基本コードです。入力をコロンで区切られた一連の整数としてエンコードします。エラーチェックに関してはあまり効果がなく、少し改善したいと思うかもしれませんが、少なくとも開始して正しい方向に進むようにする必要があります。
Visual Studio Express (まだ Visual Studio を持っていない場合) を取得して、新しい Visual C++ プロジェクトを作成し、[Win32] を選択して [Win32 プロジェクト] を選択します。「Win32 アプリケーション」を選択します。プロジェクトが作成されたら、表示される .cpp ファイル内のすべてを次のコードに置き換えます。
#include "stdafx.h"
#include <string>
int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR lpCmdLine, int)
{
std::string filename;
while((lpCmdLine != NULL) && (*lpCmdLine != 0))
{
if(filename.length() != 0)
filename.append(":");
char buf[32];
sprintf(buf, "%u", (unsigned int)(*lpCmdLine++));
filename.append(buf);
}
if(filename.length() == 0)
return 0;
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
STARTUPINFOA si;
memset(&si, 0, sizeof(STARTUPINFOA));
si.cb = sizeof(STARTUPINFOA);
char *buf = new char[filename.length() + 256]; // ensure that 256 is enough for your extra arguments!
sprintf(buf, "java.exe -jar some.jar <arguments1> \"%s\" <arguments2>", filename.c_str());
// CHECKME: You hard-coded the path for java.exe here. While that may work on your system
// is it guaranteed that it will work on every system?
if(CreateProcessA("C:\\Program Files\\Java\\jre7\\bin\\java.exe", buf, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
delete[] buf;
return 0;
}
コンパイル方法などの詳細をかなり簡単に把握できるはずです。