1

これは前の質問の繰り返しではありません。問題はプロセスにあることがわかりました。

プログラムに問題があり、JavaプロセスのInputStreamで特殊文字が失われているように見えます。

私が使用しているコードは次のとおりです。

String command = "/usr/local/bin/getTitle <URL>";
Process shellCommand = Runtime.getRuntime().exec(command);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(shellCommand.getInputStream(), "UTF-8"));
String output = null;
while ((output = stdInput.readLine()) != null) {
    System.out.println(output);
}

コマンドラインから「コマンド」を実行すると、次の出力が得られます。

PSY_-_GANGNAM_STYLE_(강남스타일)_M_V

ただし、System.out.println(output);の出力。以下のとおりであります:

PSY_-_GANGNAM_STYLE_()_M_V

そして、これは私のプログラムを完全に壊します。

私は完全に困惑していて、これに関連するものは何も検索で見つかりませんでした。どんな助けでも大歓迎です!前もって感謝します。

アップデート:

次のようにコマンドを変更した場合:

String command="echo 'PSY_-_GANGNAM_STYLE_(강남스 타일)_M_V'";

次に、出力を印刷するときに、特殊文字が正しく表示されます。これは、問題がどこにあるかを理解するのに役立ちますか?

4

3 に答える 3

0

私の推測では、このコマンドはOSのデフォルトのエンコーディング、つまりMacのMacOSRomanで文字列を返します。あなたはそれをUTF-8として読んでいます。エンコーディングが何であるかを理解し、それをInputStreamReaderのコンストラクターに渡すと、より良い結果が得られるはずです。

Javaで文字列を作成し、それを渡すと、文字列はOSではなく、Javaプロセスによって生成されるため、正常に機能します。

于 2012-10-20T12:57:29.523 に答える
0

この問題がどこかで文字エンコーディングの不一致によって引き起こされていることはかなり明らかなようです。外部プロセスから読み取っているReaderスタック、またはのPrintStreamスタックの2つの場所にある可能性がありますSystem.out。(後者はありそうもないようです)。

これが私がすることです:

  • コマンドラインからコマンドを実行してlocale、コマンドシェルで使用されている文字エンコードを確認します。

  • エンコーディングがJavaのデフォルトの文字エンコーディングと同じであることを確認してください

  • それらが両方とも、外部プロセスから読み取るために使用しているエンコーディングと同じであることを確認してください。(これを「UTF-8」に配線しました...)

それでも問題の原因が明らかにならない場合は、command文字列を"locale"に置き換えて、どのロケール設定が外部プロセスに伝達されるかを確認してください。

それでも問題が解決しない場合は、外部コマンドからの出力をバイトとしてキャプチャし、16進数で表示して、UTF-8およびその他の可能な文字セットとして手動でデコードしてみてください。

于 2012-10-20T13:41:12.910 に答える
-4

アップデート :

プログラムで出力を印刷する場合でもUTF-8、期待どおりの出力が表示されるかどうかはわかりません。そのため、他のエンコード形式でテストするとEclipse IDE、出力(日本語の文字)が表示されません。しかしUTF-8、IDEでのエンコーディングに変更すると。日本語の文字が見えます。そのため、環境のエンコーディングシステムにも依存します。

String output = null;
while ((output = stdInput.readLine()) != null) {
    String utf8OutPut = output.getBytes("UTF-8");
    System.out.println(utf8OutPut);
}
于 2012-10-20T13:18:34.237 に答える