1

JVMを呼び出してC++プログラムのコマンドライン呼び出しから与えられる可能性のあるオプションを渡すことができるWindowsC++プログラムがあります(コマンドラインオプションはプレーンテキストではない可能性があります。たとえば、「 -Dblah = japan Japan ")。jni.hのJavaVMOption構造体は、オプション文字列をcharのみとして定義しているように見えるため、幅の広い文字列を渡すことはできないようです。

UTF-8に変換し、C ++側で細い文字列として保存してから、Java側で変換して戻しましたが、「日本」が実際の「??」に置き換えられているようです。文字、したがって、変換-非変換プロセスで失われます。

私はこれについて間違って考えていますか?これはうまくいくとは思われませんか?

4

1 に答える 1

1

呼び出しAPIドキュメントはそれを明確にします:

typedef struct JavaVMOption {
    char *optionString;  /* the option as a string in the default platform encoding */
    void *extraInfo;
} JavaVMOption;

「デフォルトのプラットフォームエンコーディング」という用語は明確です。これは、Windowsでのutf-8を意味するものではありません。これは、デフォルトのシステムコードページで使用されるエンコーディングを意味します。マシンが日本語のコードページ(932など)を使用するように構成されていない場合、utf-16文字列からの変換では、変換できない日本語の文字に疑問符が生成されます。日本人ユーザーは正しいコードページが選択されるため、これは通常問題にはなりません。間違ったものを使用するための回避策はありません。

正しいシステムコードページが選択されていることを確認し、コントロールパネル+地域と言語を変更します。そして、CP_ACPでWideCharToMultiByte()を使用して変換を行います。

于 2012-11-20T01:17:15.247 に答える