NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Socket io nepodporuje UTF-8 znaky

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Šimon Lakosil:2.1.2018 20:41

Ahojte, používám následující knihovnu pro real time komunikace https://socket.io/…and-android/ .
Vše až na přenos UTF-8 znaků funguje bez problému.
Mám jednoduše websocketový server a k němu mám napojené klinety z webu a android aplikace pomocí této knihovny. Uživatelům webu vše funguje bez problému a UTF-8 znaky vidí bez problému. Avšak android aplikace má problém. Třeba místo 'ž' dostanu jako argument vlnovku, místo 'í' dostanu 'a', atd. ...
V aktivitě mám následující kód.

public void call(Object... args) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Log.wtf("CALLL", args[0].toString());
           onMessage(args[0].toString());
        }
    });
}

a už při prvním logu jsou tam špatná písmena.
Jsem si jist, že server to odesílá správně, protože uživatelům na webu vše jede OK.
Nevíte někdo co s tím ?
Díky moc!!!

 
Odpovědět
2.1.2018 20:41
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Šimon Lakosil
gcx11:2.1.2018 21:05

Ahoj, zkušenosti s tím nemám, ale v tebou odkazovaném článku je podobný kód, který ovšem příjmá data jako JSON. Není problém v tom?

private Emitter.Listener onNewMessage = new Emitter.Listener() {
    @Override
    public void call(final Object.. args) {
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                JSONObject data = (JSONObject) args[0];
                String username;
                String message;
                try {
                    username = data.getString("username");
                    message = data.getString("message");
                } catch (JSONException e) {
                    return;
                }

                // add the message to view
                addMessage(username, message);
            }
        });
    }
};
 
Nahoru Odpovědět
2.1.2018 21:05
Avatar
Neználek
Člen
Avatar
Odpovídá na Šimon Lakosil
Neználek:2.1.2018 22:14

Jakého typu jsou objekty v parametru args? Jak je implementována metoda toString?

args[0].toString()
 
Nahoru Odpovědět
2.1.2018 22:14
Avatar
Odpovídá na Neználek
Šimon Lakosil:3.1.2018 20:25

Ahoj, tady moje kompletní metoda onCreate vypadá momentálně následovně:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);
    super.onCreate(savedInstanceState);
    initialize();

    chatContent = findViewById(R.id.main_chat_content);

    this.socketManager.addEventListener("message", new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    addChatMessage((JSONObject) args[0]);
                }
            });
        }
    });

    this.socketManager.connect("Homepage:default");
}

private void addChatMessage(JSONObject informations) {
    try {
        String username = informations.getString("username");
        String content = informations.getString("content");

        chatContent.append("\n" + username + ": " + content);
    } catch (JSONException e) {
        Log.wtf("MainActivity", "JSONEXCEPTION");
        e.printStackTrace();
    }
    Log.wtf("CALLLL", informations.toString());
}

Přikládám soubor, jak vypadá dump json objektu, který dojde uživatelovi přes webovou stránka.
A zde je log "CALLLL" (nepotřebné věci smazány):

{"picture":"https:\/\mujweb.cz\/images\/players\/profile\/obrazke.png","content":"~a","time":"Dnes v 20:20"}

Prostě místo '/' dostanu '\/' a ty háčky taky blbnou ...
Co jsem si však projížděl jejich demo aplikaci, tak to mám víceméně stejně, ale i přes to jim to funguje a mě ne.
Akorát tam mám navíc:

IO.Options options = new IO.Options();
options.secure = true;
options.port = 8080;

a pak vytvořím Socket pomocí

socket = IO.socket(this.URLAdress, options);

Nevíš jak z toho ven ?
Díky moc

Editováno 3.1.2018 20:28
 
Nahoru Odpovědět
3.1.2018 20:25
Avatar
Neználek
Člen
Avatar
Odpovídá na Šimon Lakosil
Neználek:3.1.2018 21:16

Bohužel nevím. Možná se jedná o chybu v knihovně nebo serveru. Těžko říct.

Třeba to nesouvisí, ale našel jsem chybu:
Unicode decode error for Non-English characters #430
https://github.com/…a/issues/430

Používáš poslední verze?

 
Nahoru Odpovědět
3.1.2018 21:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.