3

システムのデフォルトのエンコーディングの代わりにutf-8を使用する(またはjvmが実行される)ようにjarを強制する方法と同様の問題に直面しています。サーバーとクライアントのJavaアプリケーションがあります。両方をEclipseから実行すると、すべてが正常に機能します。私がjarファイルを作成すると、それらの間で交換された文字列が台無しになります(間違ったエンコーディング)。

JVMパラメータを使用して両方のイメージを実行すると、-Dfile.enconding=utf-8問題なく動作します。しかし、上記のリンクはそれが最善の解決策ではないと言っているので(少なくともbatからjarを実行する必要があります)、BufferedReaderにエンコーディングを指定することで問題を解決しようとしました。しかし、それは失敗し、jarを使用するとデバッグが困難になります。

このコードは、リクエストを送信し、返信としてJSON形式で1行を取得するためのものです。応答はUTF-8エンコーディングであることが証明されています。

public static String sendRequest (String request) {
    if (request == null) return null;

    try {
        URL url = new URL(request);
        HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
        BufferedReader inReader = new BufferedReader(new InputStreamReader(con.getInputStream(), Charset.forName("UTF-8")));
        String line = inReader.readLine();
        inReader.close();
        return line;
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }

    return null;
}

このように線が見えます

{"response":[{"uid":123456、 "first_name": "Имя"、 "last_name":"Фамилия"}]}

次に、Gson.fromJson()で使用するために準備します。

int beginIndex = reply.indexOf('[');
int endIndex = reply.indexOf(']');
reply = reply.substring(beginIndex + 1, endIndex);
SocialPerson vkPerson = new Gson().fromJson(reply, SocialPerson.class);

その後、文字列はChannelBuffers.wrappedBuffer()とNettyUtils.writeStrings()で生成されたNettyのChannelBufferを使用してサーバーに送信されます。

Eclipseでクライアントをデバッグし、jarから実行しているサーバーをデバッグしようとすると、Eclipseは、文字列が実際にフレームワークに渡されて配信されるまで、有効に見えることを示します。

次に、サーバーとクライアントの実行をJarからデバッグします。文字列を受信すると、すでにゴミのように見えます。

サーバー側

    private final String username;
    private final String password;

    public SimpleCredentials(ChannelBuffer buffer)
    {
        this.username = NettyUtils.readString(buffer);
        this.password = NettyUtils.readString(buffer);
    }

問題はどこにあると思いますか?申し訳ありませんが、ここにすべてのコードを投稿することはできません。

UPD: ユーザー名はfirstNameとlastNameから生成されます

ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(opCode, NettyUtils.writeStrings(userId, userName, refKey));
4

2 に答える 2

3

ネットワークストリームを読み取るときに、自動的に失敗した場合は、文字列を手動で再エンコードする必要があります。使用しているライブラリがコンテンツエンコーディングを無視しているか、HTTP応答に欠落している可能性があります。

コードのどこかに、Stringコンストラクターで変換できるバイト配列があります。

String xxx = new String(bytes, "utf-8");

間違ったエンコーディングの文字列を取得した場合は、次のコードを確認できます。

String rightEncoded = new String(wrongEncodedString.getBytes("Cp1252"), "utf-8");
于 2012-11-28T06:34:20.967 に答える
1

file.encodingシステムプロパティを使用しないでください。

このようなエンコーディングの問題を回避する最善の方法は、デフォルトのプラットフォームエンコーディングについて何も想定せず、リーダーを構築するとき、またはバイトを文字列に変換するとき、またはその逆のときに常にエンコーディングを提供することです。

あなたのsendRequestメソッドは、エンコーディングの処理に関しては問題ないようです。入力から文字を読み取り、ストリームがUTF-8でエンコードされることを明示的に示しています。

ただし、クライアント/サーバーシーケンスのもう一方の端は表示されません。あなたを引用する:

その後、文字列はChannelBuffers.wrappedBuffer()とNettyUtils.writeStrings()で生成されたNettyのChannelBufferを使用してサーバーに送信されます。

また、ここにコード全体を添付することはできないとおっしゃいましたが、これは理解できることです。したがって、これらの文字列をどの程度正確に送信しているか、および送信中にエンコーディングを明示的に指定しているかどうかを確認することをお勧めします。

OPの更新に従って編集します。Nettyに慣れていないことをお詫びしますが、それでもここで写真を撮ります。NettyUtils.writeStrings()、またはそれを呼び出すコードは、文字エンコードを受け入れませんか?NettyUtilsオンラインでJavaDocが見つかりません。ここで私と一緒に働いてください。:-)

于 2012-11-28T06:29:49.507 に答える