6

独自の API を使用して Eclipse で Java プログラムを開発していますが、実行時に次の例外がスローされます。

java.io.UnsupportedEncodingException: 
    at java.lang.StringCoding.encode(StringCoding.java:287)
    at java.lang.String.getBytes(String.java:954)...

私のコード:

private static String SERVER = "localhost";
private static int PORT = 80;
private static String DFT="";
private static String USER = "xx";
private static String pwd = "xx";


public static void main(String[] args) {

    LLValue entInfo = new LLValue();
    LLSession session = new LLSession(SERVER, PORT, DFT, USER, pwd);

    try {
        LAPI_DOCUMENTS doc = new LAPI_DOCUMENTS(session);
        doc.AccessPersonalWS(entInfo);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

セッションはエラーなしで開いているように見えますが、エンコード例外が doc.AccessEnterpriseWS(entInfo) でスローされます。

このエラーの調査を通じて、コンパイラの -encoding オプションの使用、エディタのエンコーディングの変更などを試みました。

私の質問は次のとおりです。

  1. 使用しようとしている .class ファイルのエンコーディングを調べるにはどうすればよいですか?
  2. 新しいプログラムのエンコーディングを API のエンコーディングに一致させる必要がありますか?
  3. java がマシンに依存しない場合、標準エンコーディングがないのはなぜですか?

このスタック トレースとこのガイドは既に読みました --

どんな提案でも大歓迎です!

乾杯

4

2 に答える 2

3

String.getBytes()またはにブレークポイントを設定して、デバッガーで実行しますStringCoding.encode()。どちらもJDKのクラスであるため、それらにアクセスでき、サードパーティが何を渡しているかを確認できるはずです.

文字エンコーディングは、生のバイナリの解釈方法を指定するために使用されます。CP1252 の英語版 Windows システムのデフォルトのエンコード。他の言語やシステムでは、異なるデフォルト エンコーディングが使用されている場合があります。簡単なテストとして、UTF-8 を指定して、問題が魔法のように消えるかどうかを確認してみてください。

この質問に記載されているように、JVM は OS のデフォルトのエンコーディングを使用しますが、このデフォルトをオーバーライドできます。

使用しようとしているサード パーティの API について詳しく知らなければ、使用している可能性のあるエンコーディングを特定することは困難です。残念ながら、その実装を見ると、 をStringCoding.encode()取得できる方法がいくつかあるようですUnsupportedEncodingException。デバッガーでステップスルーすると、物事を絞り込むのに役立ちます。

于 2012-04-19T21:04:34.820 に答える
0

独自の API の何かがString.getBytes文字セットの空の文字列で呼び出しているように見えます。

次のクラスをコンパイルしました

public class Test2 {
    public static void main(String[] args) throws Exception {
        "test".getBytes("");
    }
}

実行すると、次のスタックトレースが得られました。

スレッド「メイン」での例外 java.io.UnsupportedEncodingException:
        java.lang.StringCoding.encode(StringCoding.java:286) で
        java.lang.String.getBytes(String.java:954) で
        Test2.main (Test2.java:3) で

これがクラスファイルが書かれているエンコーディングと関係があるとしたら、私は驚くでしょう。これはコードの問題であり、ファイルのエンコーディングやコンパイラ/JVM スイッチを変更することで修正できる問題ではないように思えます。

このプロプライエタリ API が何をすべきか、またはどのように機能するかについては何も知りません。おそらく、Java EE または Web アプリケーション コンテナー内で実行されることを期待しているのでしょうか? おそらくバグがありますか?おそらく、例外をスローせずに実行するには、さらに構成が必要でしょうか? プロプライエタリであることを考えると、ベンダーから何らかのサポートを得ることができますか?

于 2012-04-19T21:30:49.000 に答える