Emoji unicode problème avec java.pot


Je développe une application de chat dans J2SE qui peut également envoyer des émoticônes à un autre utilisateur.

L'application utilise https://github.com/vdurmont/emoji-java J'ai besoin d'un peu de temps pour le faire.]}

J'ai suivi tout ce qui est décrit sur ce lien, Tout fonctionne bien pendant l'environnement de développement, mais quand je fais jar pour le même, quand j'envoie des émoticônes à un autre utilisateur sur le Web, il affiche le code (🡠et ? ).

Tout d'abord, je pense que c'est un problème de chargement de fichiers à partir du dossier ainsi utilisé ClassLoader, pour obtenir l'image appropriée mais lors de la création du pot, il montre ?(point d'interrogation) , J'ai donc supprimé ce code pour mieux vous comprendre.

Le code est écrit ci-dessous ci-dessous:

public ChatUI() {

        initComponents();

        this.setLayout(new WrapLayout(FlowLayout.LEFT, 5, 5));

        for (int i = 0; i < imageHexaCode.length; i++)
        {

            final javax.swing.JLabel imogis = new javax.swing.JLabel("&#x" + imageHexaCode[i] + ";");


            imogis.setCursor(new Cursor(Cursor.HAND_CURSOR));

            imogis.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[i] + ".png")));

            imogis.setHorizontalTextPosition(JLabel.CENTER);

            imogis.setVerticalTextPosition(JLabel.BOTTOM);

            imogis.setFont(new Font(null, Font.PLAIN, 1));

            imogis.setForeground(Color.white);

            final int aa = i;

            imogis.addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {

                    JLabel jl = new JLabel("&#x" + imageHexaCode[aa] + ";");

                    jl.setName("&#x" + imageHexaCode[aa] + ";");

                    jl.setFont(new Font(null, Font.PLAIN, 1));

                    jl.setHorizontalTextPosition(JLabel.CENTER);

                    jl.setVerticalTextPosition(JLabel.BOTTOM);

                    jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")));

                    jl.setForeground(Color.white);

                    ChatPaneWrite.jtp.insertComponent(jl);

                    System.out.println("" + imogis.getText());

                    // you can open a new frame here as
                    // i have assumed you have declared "frame" as instance variable

                }

            });

            this.add(imogis);

        }

        this.revalidate();

        this.repaint();

    }

Où imageHexaCode est un tableau de chaîne d'imoticons.

    static String[] imageHexaCode = {
            "1f621",
            "1f608",
            "2764",
            "1f494"
};

& jtp est JTextPane où l'insertion du composant imoticons lorsque l'utilisateur clique sur l'étiquette

ChatPaneWrite.jtp.insertComponent(jl);

Les émoticônes sont stockées dans le même paquet où j'écris c'est pourquoi je n'ai pas utilisé ClassLoader en ligne

jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")));

Ou il peut aussi écrire comme pour le paquet ChatUI

jl.setIcon(new javax.swing.ImageIcon(getClass().ClassLoader.getResource("ChatUI/emoji_" + imageHexaCode[aa] + ".png")));

Voici des clichés instantanés:

Dans le pot à la fin de réception montrant que les émoticônes comme ça

entrez la description de l'image ici

Aidez-moi à régler ça.

Très reconnaissant à tous à l'avance

Author: Dheeraj Upadhyay, 2016-04-08

2 answers

La première étape consiste à vérifier que les ressources d'image sont bien là lors de l'exécution. Par exemple, ajoutez une journalisation de la valeur de getClass().getResource("emoji_" + imageHexaCode[aa] + ".png") pour vous assurer qu'elle n'est pas null. Il est possible que dans votre environnement de développement, ceux-ci soient disponibles, mais en raison de la façon dont vous construisez votre version de production, ils sont en quelque sorte manqués ou placés dans le mauvais répertoire.

Cependant, si cela ne vous dérange pas, je voudrais également suggérer une approche alternative: plutôt que d'utiliser des étiquettes et une image icônes, avez-vous envisagé de construire vos émoticônes dans une police, puis d'expédier le fichier de police avec votre application? Cela aurait plusieurs avantages significatifs:

  1. Vous n'auriez pas besoin d'une manipulation spéciale pour les émoticônes: il suffit de mettre le texte unicode dans un composant qui utilise votre police personnalisée et les émoticônes ainsi que tous les autres textes fonctionneront.

  2. Les images de police peuvent être des images vectorielles ce qui signifie qu'elles peuvent évoluer bien comme les utilisateurs changer la taille de police/niveau de zoom etc.

  3. L'utilisateur peut couper/copier/coller du texte contenant les émoticônes; comme il s'agit de texte, il "fonctionnera" à nouveau.

Si vous décidez de prendre cette route, il existe un excellent éditeur de polices open source que j'ai déjà utilisé appelé FontForge: https://fontforge.github.io/en-US / . C'est assez facile: il vous suffit de concevoir l'image dans l'emplacement approprié pour le code de caractère, puis d'exporter le fichier de police.

 1
Author: Rich, 2016-04-24 08:47:50

Emoji-java utilise l'encodage UTF-8 pour l'analyse et par défaut Netbeans utilise également le même, c'est pourquoi votre analyse s'est bien déroulée lorsqu'elle est exécutée dans Netbeans.

Mais lorsque vous exécutez le programme en tant que fichier jar, le schéma d'encodage sera basé sur votre environnement système.

Comme solution rapide, vous pouvez forcer l'utilisation de l'encodage UTF-8 pour exécuter votre fichier jar.

java -Dfile.encoding=UTF-8 -jar your-jar-file.jar

Ou si vous voulez une solution programmatique, peut utiliser ce code

System.setProperty("file.encoding", "UTF-8");
java.lang.reflect.Field charset = null;
charset = java.nio.charset.Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null, null);

C'est un problème général dans le emoji-java par vdurmont. Les deux la solution fonctionne pour moi.

 0
Author: Krish Nakum R, 2016-10-05 12:06:33