使用java .jar的表情符号unicode问题

Dhe*_*yay 8 java unicode jar emoji

我正在开发J2SE中的聊天应用程序,它也可以向其他用户发送表情符号.

应用程序使用https://github.com/vdurmont/emoji-java(Vdurmont Emoji-java-2.1 jar),

我跟着该链路上任何一个所描述的所有的事情,所有正在运行的开发环境中正常,但当我做罐子一样的,当我发送表情符号在网络上的其他用户的,则显示的代码(ðŸ~¡和?).

首先,我认为这是一个从文件夹加载文件的问题,所以使用ClassLoader,以获得正确的图像,但在创建jar时它显示?(问号),所以我删除了该代码,以便更好地理解你.

代码如下:

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();

    }
Run Code Online (Sandbox Code Playgroud)

其中imageHexaCode是一系列表情符号的数组.

    static String[] imageHexaCode = {
            "1f621",
            "1f608",
            "2764",
            "1f494"
};
Run Code Online (Sandbox Code Playgroud)

&jtp是JTextPane,用户点击标签时插入表情符号组件

ChatPaneWrite.jtp.insertComponent(jl);
Run Code Online (Sandbox Code Playgroud)

表情符号存储在我写的同一个包中,这就是我没有使用ClassLoader的原因

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

或者它也可以像包ChatUI一样写

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

这是快照:

在接收端的罐子里显示这样的表情符号

在此输入图像描述

请帮我解决一下.

非常感谢所有人提前

Ric*_*ich 1

第一步是检查图像资源在运行时是否确实存在。例如,添加一些值的记录getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")以确保它不是null。在您的开发环境中,这些可能是可用的,但由于您构建生产版本的方式,它们可能会以某种方式丢失或放入错误的目录中。

但是,如果您不介意,我还想建议一种替代方法:您是否考虑过将表情符号构建为字体,然后随应用程序一起提供字体文件,而不是使用标签和图像图标?这将有几个显着的优点:

  1. 您不需要对表情符号进行任何特殊处理:只需将 unicode 文本放入使用自定义字体的组件中,表情符号以及所有其他文本即可正常工作。

  2. 字体图像可以是矢量图像,这意味着它们可以随着用户更改字体大小/缩放级别等而很好地缩放。

  3. 用户可以剪切/复制/粘贴包含表情符号的文本;因为它是文本,所以它会再次“正常工作”。

如果您决定走这条路,我之前使用过一个优秀的开源字体编辑器 FontForge: https: //fontforge.github.io/en-US/。这非常简单:您只需在适合字符代码的插槽中设计图像,然后导出字体文件。