簡體   English   中英

從JAR運行時編碼錯誤,從Eclipse運行完美

[英]Wrong encoding when running from JAR, from Eclipse works perfectly

我面臨的問題類似於如何強制使用jar(或jvm運行)utf-8而不是系統的默認編碼 有一個服務器和客戶端java應用程序。 如果我從Eclipse運行它們,那么一切正常。 如果我制作jar,那么在它們之間交換的字符串會被破壞(編碼錯誤)。

如果我使用-Dfile.enconding=utf-8 JVM參數運行兩個圖像,那么它可以正常工作。 但由於上面的鏈接說它不是最好的解決方案(至少需要從bat運行jar)我試圖通過為BufferedReader指定編碼來解決問題。 但它失敗了,使用jar很難調試。

此代碼用於發送請求並以JSON格式獲取一行作為回復。 證明該回復具有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;
}

這就是線條的樣子

{ “響應”:[{ “UID”:123456 “如first_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將String發送到服務器。

我嘗試調試Eclipse中的Client和從jar運行的Server,然后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));

當您讀取網絡流時,如果自動方式失敗,則需要手動重新編碼字符串。 您正在使用的庫可能忽略了內容編碼,或者可能在HTTP響應中丟失了。

代碼中的某個地方將是一個字節數組,您可以在String構造函數中進行轉換:

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

如果您使用錯誤的編碼獲取String,則可以檢查以下代碼:

String rightEncoded = new String(wrongEncodedString.getBytes("Cp1252"), "utf-8");

您不應該使用file.encoding系統屬性。

避免此類編碼問題的最佳方法是永遠不要假設有關默認平台編碼的任何內容,並在構造讀取器或將字節轉換為字符串時始終提供編碼,反之亦然。

對於處理編碼,你的sendRequest方法似乎沒問題:它從輸入中讀取字符,明確提到它希望流以UTF-8編碼。

但是,我們無法看到客戶端/服務器序列的另一端。 引用你:

之后,使用通過ChannelBuffers.wrappedBuffer()和NettyUtils.writeStrings()生成的Netty的ChannelBuffer將String發送到服務器。

你還提到你不能在這里附上整個代碼,這是可以理解的; 因此,我建議你研究一下你是如何准確地發送這些字符串的,以及你是否在這樣做時明確指定了編碼。

根據OP的更新編輯 :嗯,我很抱歉我不熟悉Netty,但我仍然會在這里拍攝。 NettyUtils.writeStrings()或任何調用它的代碼都不接受字符編碼嗎? 我無法在線找到任何NettyUtils的JavaDoc。 在這里與我合作。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM