システムのデフォルトのエンコーディングの代わりに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));